2016-07-10 16 views
1

私はC#でNPR XML APIを使用しています。私はlinkノードが3つあり、唯一の違いはtypeという属性のXMLオブジェクトを持っています。属性を持つXMLの直列化を直列化復元する#

<story id="485432424"> 
    <link type="html">http://www.npr.org/2016/07/10/485432424/with-administrative-corruption-in-afghanistan-u-s-troops-presence-won-t-make-any?ft=nprml&amp;f=1149</link> 
    <link type="api">http://api.npr.org/query?id=485432424&amp;apiKey=MDIxNjY4ODAwMDE0NTAxMjAwODQ4ZTA1Nw000</link> 
    <link type="short">http://n.pr/29EFodu</link> 

私は配列にこれらのリンクをデシリアライズし、htmlリンクのバージョンを取得するためにstory.Links[0]のようなものを呼び出すことができます知っているが、それは貧しい人々のデザインのように思えます。私のStoryオブジェクトに直接HTML、API、Shortプロパティを持たせることが望ましいので、story.Link.HTMLまたはstory.Link.APIのようにアクセスできます。

Microsoft XMLライブラリでこれを実現する方法はありますか?私は残念なことに、このようなことをするデコレータは見つけられませんでした。

+0

ことができていないようです。 – niksofteng

+0

コンポジションを使用するか、新しいクラスにマップしてください –

答えて

1

これは古い学校の方法ですが、私は以下のようなことをして、自分のクラス構造を作成します。

class Program 
{ 
    static void Main(string[] args) 
    { 
     string sXml = @"<story id=""485432424""> 
       <link type=""html"">http://www.npr.org/2016/07/10/485432424/with-administrative-corruption-in-afghanistan-u-s-troops-presence-won-t-make-any?ft=nprml&amp;f=1149</link> 
       <link type=""api"">http://api.npr.org/query?id=485432424&amp;apiKey=MDIxNjY4ODAwMDE0NTAxMjAwODQ4ZTA1Nw000</link> 
       <link type=""short"">http://n.pr/29EFodu</link> 
      </story>"; 

     System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); 
     doc.LoadXml(sXml); 

     Story story = new Story(doc.DocumentElement); 

     Console.Write(story.ToString()); 
     Console.ReadLine(); 
    } 
} 

class Story 
{ 
    public Link Link { get; set; } 
    public Story(System.Xml.XmlNode nStory) 
    { 
     this.Link = new Link(); 
     foreach (System.Xml.XmlNode nLink in nStory.ChildNodes) 
     { 
      if (nLink.NodeType == System.Xml.XmlNodeType.Element) 
      { 
       this.Link.AddLink(nLink); 
      } 
     } 
    } 
    public override string ToString() 
    { 
     return new StringBuilder().Append(
      "Html: ").Append(this.Link.Html).Append(Environment.NewLine).Append(
      "Api: ").Append(this.Link.Api).Append(Environment.NewLine).Append(
      "Short: ").Append(this.Link.Short).Append(Environment.NewLine).ToString(); 
    } 
} 
class Link 
{ 
    public string Html { get; set; } 
    public string Api { get; set; } 
    public string Short { get; set; } 

    public Link() 
    { 
    } 
    public void AddLink(System.Xml.XmlNode nLink) 
    { 
     switch (nLink.Attributes["type"].Value) 
     { 
      case "html": 
       Html = nLink.InnerText; 
       break; 
      case "api": 
       Api = nLink.InnerText; 
       break; 
      case "short": 
       Short = nLink.InnerText; 
       break; 
     } 
    } 
} 
+0

これに簡単に統合された解決策はないように思いますが残念です。しかし、あなたは私が求めたものを解決しました - ありがとう! –

1

あなたはXDocument使用することができます

void Main() 
{ 
    var xml = @"<story id=""485432424""> 
     <link type=""html"">http://www.npr.org/2016/07/10/485432424/with-administrative-corruption-in-afghanistan-u-s-troops-presence-won-t-make-any?ft=nprml&amp;f=1149</link> 
     <link type=""api"">http://api.npr.org/query?id=485432424&amp;apiKey=MDIxNjY4ODAwMDE0NTAxMjAwODQ4ZTA1Nw000</link> 
     <link type=""short"">http://n.pr/29EFodu</link> 
     </story>"; 

    using (var reader = new StringReader(xml)) 
    { 
     var stories = new List<Story>(); 
     var xDoc = XDocument.Load(reader); 
     foreach (var storyElement in xDoc.Elements("story")) 
     { 
      var story = new Story(); 
      foreach (var linkElement in storyElement.Elements("link")) 
      { 
       var value = linkElement.Attribute("type").Value; 
       if (value == "html") 
        story.Html = linkElement.Value; 
       else if (value == "api") 
        story.Api = linkElement.Value; 
       else if (value == "short") 
        story.Short = linkElement.Value; 
      } 
      stories.Add(story); 
     } 

     // process stories; 
    } 
} 

public class Story 
{ 
    public string Html { get; set; } 
    public string Api { get; set; } 
    public string Short { get; set;} 
} 
関連する問題