繁体   English   中英

C# 从 XML 获取特定元素

[英]C# getting specific elements from XML

如何从此 XML 文件中获取指定的元素? 假设我只想要标签末尾的 sub11、sub12 等部分,这些部分可能包含 SUB**、每个标签中的任何内容或其他内容到数组中?

另外,即使一个 Ex 下有两个标签,我怎么能得到每个标签的 Ex 名称? 如果我要写一行来列出,我会想要 Ex 名称,然后是所有标签信息。 像第一行示例:test1, Subject1, SUB11, 80, SUB12, 31, SUB13, 2 列表行中第一个 EX 的示例输出。 第二个应该是:test2, Subject2, SUB21, 100, SUB22, 20, SUB23, 0 第三个:test2, Subject3, SUB31, etc...

我有从 xml 文件获取数据的实际经验。 所以我不知道如何定位特定部分,即使你搜索了几个小时关于如何定位 xml 节点、子节点等也没有找到我想要的。

<Folder>
   <Ex>
      <Name>test1</Name>
      <Tags>
         <TagEx>
            <Name>Subject1</Name>
            <Tag Type="Maximum" Score="80" ExxTag="no">SUB11</Tag>
            <Tag Type="Average" Perc="31" ExxTag="no">SUB12</Tag>
            <Tag Type="Status" Results="2" ExxTag="no">SUB13</Tag>
         </TagEx>
      </Tags>
   </Ex>
   <Ex>
      <Name>test2</Name>
      <Tags>
         <TagEx>
            <Name>Subject2</Name>
            <Tag Type="Maximum" Score="100" ExxTag="no">SUB21</Tag>
            <Tag Type="Average" Perc="20" ExxTag="no">SUB22</Tag>
            <Tag Type="Status" Results="0" ExxTag="no">SUB23</Tag>
         </TagEx>
      </Tags>
      <Tags>
         <TagEx>
            <Name>Subject3</Name>
            <Tag Type="Maximum" Score="10" ExxTag="no">SUB31</Tag>
            <Tag Type="Average" Perc="50" ExxTag="no">SUB32</Tag>
            <Tag Type="Status" Results="3" ExxTag="no">SUB33</Tag>
         </TagEx>
      </Tags>
   </Ex>
</Folder>

我尝试了几种方法,但最终得到了完全不同的空值。

编辑:根据要求,我可以提供我尝试过的内容,但在这种情况下它无济于事,因为它几乎无关紧要,因为我想像我现在所做的那样针对某些而不是全部,但它是这样的:

        var xmldoc = XDocument.Load(ExFile);

        foreach (var name in xmldoc.Descendants("TagEx").Elements()
                            .Select(x => new {
                                Value = x.Value,
                                Type = x.Attribute("Type"),
                                Score = x.Attribute("Score"),
                                Perc = x.Attribute("Perc"),
                                Rest = x.Attribute("Results"),
                                ExxTag = x.Attribute("ExxTag")
                            }))

    {

        if (name.Score != null)
        {
            DScore = name.Score.ToString();
    AScore.Add(ClearSTR(DScore));
        }
    for (int i = 0; i < AType1.Count; i++)
        {
        string[] row = { etc[i],AScore[i],etc[i],etc[i],etc[i],etc[i]};
        var listViewItem = new ListViewItem(row);
        ListViewData.Items.Add(listViewItem);
        }

EDIT2:我通过只收集所有 xml 数据而不是选择我想要的数据然后按照接收项目的顺序和值可能包含的可能性对它们进行循环排序来解决它。 它工作得很好,但不是我想要的。 我只是想选择我想要的目标。 所以我不会将此添加为解决方案,因为我仍然很想知道如何从 xml 中选择目标。

谢谢你的帮助!

试一试:

IEnumerable<IEnumerable<string>> data =
    from ex in XDocument.Parse(source).Root.Elements("Ex")
    let exname = ex.Element("Name").Value
    from tags in ex.Elements("Tags")
    let tagex = tags.Element("TagEx")
    let tagexname = tagex.Element("Name").Value
    let maximum =
        from tag in tagex.Elements("Tag")
        where tag.Attribute("Type").Value == "Maximum"
        select new [] { tag.Value, tag.Attribute("Score").Value }
    let average =
        from tag in tagex.Elements("Tag")
        where tag.Attribute("Type").Value == "Average"
        select new [] { tag.Value, tag.Attribute("Perc").Value }
    let status =
        from tag in tagex.Elements("Tag")
        where tag.Attribute("Type").Value == "Status"
        select new [] { tag.Value, tag.Attribute("Results").Value }
    let xs = maximum.Concat(average).Concat(status).SelectMany(x => x)
    select new [] { exname, tagexname, }.Concat(xs);

我得到:

test1, Subject1, SUB11, 80, SUB12, 31, SUB13, 2
test2, Subject2, SUB21, 100, SUB22, 20, SUB23, 0
test2, Subject3, SUB31, 10, SUB32, 50, SUB33, 3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM