使用LINQ分析XML文件时得到错误的信息
本文关键字:错误 信息 LINQ 分析 XML 文件 使用 | 更新日期: 2023-09-27 18:24:27
我试图从我的程序中解析一个XML文件,我的代码基于这个答案。
然而,我现在使用的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,这让我很困惑。
代码的问题在这里pictures = xmlDoc.Descendants("picture").
&CCD_ 2。您再次从顶部查询XML,而不是查询已经过滤的数据。您应该使用实例变量be
&CCD_ 4。
这将为您提供预期的输出:-
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();
另外,请注意我是如何用Elements
替换Descendants
的。若XML包含一些具有相同标记的内部节点,那个么就会得到意外的输出。
pictures=xmlDoc.Descendants("picture")
看起来你可以从整个文档xmlDoc.Denudants中获得图片,但相反,我认为你需要为每个be对象获取它。我现在不能检查,但我想可以。骗子应该没事吧?