使用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,这让我很困惑。

使用LINQ分析XML文件时得到错误的信息

代码的问题在这里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对象获取它。我现在不能检查,但我想可以。骗子应该没事吧?