2

Windows Phone 8アプリを開発しようとしています(wp8 devは初めてです)。

次のようなXMLファイルがあります。


<?xml version="1.0" ?> 
<root>
   <quotes>
      <quote>
         <author></author>
         <text></text>
         <text></text>
         <text></text>
      </quote>
   </quotes>
</root>

これは私のQuotesクラスです:

[XmlRoot("root")]
public class Quotes
{
   [XmlArray("quotes")]
   [XmlArrayItem("quote")]
   public ObservableCollection<Quote> Collection { get; set; }
}

これは引用クラスです:

public class Quote
{
   [XmlElement("author")]
   public string author { get; set; }

   [XmlElement("text")]
   public string text { get; set; }
}

次に、このコードを使用して逆シリアル化します。

XmlSerializer serializer = new XmlSerializer(typeof(Quotes));
XDocument document = XDocument.Parse(e.Result);
Quotes quotes = (Quotes) serializer.Deserialize(document.CreateReader());
quotesList.ItemsSource = quotes.Collection;

// selected Quote
        Quote quote;

        public QuotePage()
        {
            InitializeComponent();

            // get selected quote from App Class
            var app = App.Current as App;
            quote = app.selectedQuote;

            // show quote details in page
            author.Text = quote.author;
            text.Text = quote.text;

        }  

これは、1つのセクションを持つこの構造を持つすべてのフィードで正常に機能し<text>ます。しかし、私はたくさんの餌を持っています<text>

上記のC#コードを使用すると、最初の<text>セクションのみが解析され、他のセクションは無視されます。<text>単一のXMLフィードのセクションごとに個別のListまたはObservableCollectionを作成する必要があります。

4

1 に答える 1

1

Quoteクラスを次List<string> textの代わりに含むように変更しますstring text

public class Quote
{
    [XmlElement("author")]
    public string author { get; set; }

    [XmlElement("text")]
    public List<string> text { get; set; }
}

アップデート

アプリ内の既存の機能と現在のQuoteクラス メンバーのため、シリアル化を終了し、LINQ to XML を使用して XML からQuotesクラス インスタンスにデータを読み込みます。

XDocument document = XDocument.Parse(e.Result);
Quotes quotes = new Quotes() {
    Collection = document.Root
                         .Element("quotes")
                         .Elements("quote")
                         .Select(q => new {
                             xml = q,
                             Author = (string) q.Element("author")
                         })
                         .SelectMany(q => q.xml.Elements("text")
                                           .Select(t => new Quote() {
                                                author = q.Author,
                                                text = (string)t
                                            }))
                         .ToList()
};

QuotesQuoteクラス宣言でテストしました。

public class Quotes
{
    public List<Quote> Collection { get; set; }
}

public class Quote
{
    public string author { get; set; }

    public string text { get; set; }
}

このアプローチでは XmlSerialization を使用しないため、属性は不要になりました。

于 2013-03-18T16:24:31.323 に答える