使用LINQ解析XML文件获取错误信息

时间:2015-11-26 12:18:59

标签: c# xml linq

我正在尝试解析程序中的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,这对我来说非常困惑。

2 个答案:

答案 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包含一些具有相同标记的内部节点,那么您将获得意外的输出。