我正在尝试解析程序中的XML文件,并且我的代码基于此answer。
然而,我现在使用的XML有点复杂,我需要用类填充几个嵌套列表。这是我的两个班级
public class Picture
{
private int mPicNumber;
private int mPicDuration;
private List<string> mToSay = new List<string>();
public Picture(int picNumber, int picDuration, List<string> toSay){...}
}
public class Sequence
{
string mName;
int mNumber;
List<Picture> mPictures = new List<Picture>();
public Sequence(string name, int number, List<Picture> pictures){...}
}
XML看起来像这样
<sequences>
<sequence>
<name>Seq 2</name>
<number>1</number>
<picture>
<number>1</number>
<duration>5</duration>
<rows>
<text>text1</text>
<text>text2</text>
<text>text3</text>
</rows>
</picture>
<picture>
<number>2</number>
<duration>5</duration>
<rows>
<text>text1</text>
<text>text2</text>
<text>text3</text>
</rows>
</picture>
<picture>
<number>3</number>
<duration>5</duration>
<rows>
<text>text1</text>
<text>text2</text>
<text>text3</text>
</rows>
</picture>
</sequence>
<sequence>
<name>Seq 2</name>
<number>1</number>
<picture>
<number>1</number>
<duration>5</duration>
<rows>
<text>text1</text>
<text>text2</text>
<text>text3</text>
</rows>
</picture>
<picture>
<number>2</number>
<duration>5</duration>
<rows>
<text>text1</text>
<text>text2</text>
<text>text3</text>
</rows>
</picture>
<picture>
<number>3</number>
<duration>5</duration>
<rows>
<text>text1</text>
<text>text2</text>
<text>text3</text>
</rows>
</picture>
</sequence>
</sequences>
以下是解析XML的代码
XDocument xmlDoc = XDocument.Load("Sequences.xml");
List<Picture> pictures;
List<string> toSay;
mSequences = xmlDoc.Descendants("sequence").
Select(be => new Sequence(
(string)be.Element("name"),
(int)be.Element("number"),
pictures = xmlDoc.Descendants("picture").
Select(bf => new Picture(
(int)bf.Element("number"),
(int)bf.Element("duration"),
toSay = xmlDoc.Descendants("rows").
Select(bg =>
(String)bg.Element("text")).ToList())).ToList())).ToList();
运行后,我得到一个包含2个序列的列表(这是正确的),名称和编号是正确的。但是,每个序列包含XML文件中的所有6个图片,并且这些图片不包含rows标记内的任何内容。我尝试在两个内部列表上将Descendants更改为Elements,但后来我在所有序列中都获得了0张图片。我承认我不太擅长LINQ,这对我来说非常困惑。
答案 0 :(得分:1)
pictures = xmlDoc.Descendants(&#34;图片&#34;)
看起来你从整个文档xmlDoc.Decendants中获取了Pics, 但相反,你需要为我认为的每一个对象得到它。我现在不能检查它,但我想是的.Decentans应该没事吗?
答案 1 :(得分:1)
您的代码存在问题pictures = xmlDoc.Descendants("picture").
&amp; toSay = xmlDoc.Descendants("rows").
。您再次从顶部查询XML,而不是您应该查询已经过滤的数据。您应该使用实例变量be
&amp;分别为bf
。
这将为您提供预期的输出: -
var res = xdoc.Root.Elements("sequence")
.Select(be => new Sequence(
(string)be.Element("name"),
(int)be.Element("number"),
pictures = be.Elements("picture")
.Select(bf => new Picture(
(int)bf.Element("number"),
(int)bf.Element("duration"),
toSay = bf.Element("rows").Elements("text")
Select(bg =>
(String)bg).ToList()))
.ToList()))
.ToList();
另外,请注意我已将Descendants
替换为Elements
。如果XML包含一些具有相同标记的内部节点,那么您将获得意外的输出。