我正在尝试开发一款Windows Phone 8应用程序(我是wp8 dev中的新用户)。
我有一个XML文件,如下所示:
<?xml version="1.0" ?>
<root>
<quotes>
<quote>
<author></author>
<text></text>
<text></text>
<text></text>
</quote>
</quotes>
</root>
这是我的行情课程:
[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;
}
这种方法在具有此<text>
部分结构的每个Feed中都能正常工作。但是我提供了很多<text>
如果我使用上面的C#代码,则只解析第一个<text>
部分,忽略其他部分。我需要为单个XML Feed中的每个<text>
部分创建单独的List或ObservableCollection。
答案 0 :(得分: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()
};
我已经使用以下Quotes
和Quote
类声明对其进行了测试:
public class Quotes
{
public List<Quote> Collection { get; set; }
}
public class Quote
{
public string author { get; set; }
public string text { get; set; }
}
不再需要属性,因为此方法不使用XmlSerialization。