C#迭代并比较多个节点

时间:2018-12-20 09:39:39

标签: c# xml xpath

我有一个XML文件,我需要遍历XML文件并比较节点的属性值。条件是节点元素中的属性应设置特定的值。

让我通过以下示例使它更易于理解:

<Node name="SomeName">
<Element attribute="somevalue"/>
</Node>
<Node name="SomeNameMore">
 <Element attribute="somevalue"/>
</Node>
<Node name="SomeNameEtc.">
 <Element attribute="somevaluenotmatch"/>
</Node>
<Node name="SomeName">
 <Element attribute="somevalue"/>
</Node>

XML文件中有100个类似的节点。

第一个条件:匹配属性“ somevalue”

第二条件:将第一条件(结果)中的所有节点与节点中的属性名称进行比较。

我已经完成了以下工作:

        XmlTextReader Reader = new XmlTextReader("C:\\TEST\test.xml");
        XmlDocument doc = new XmlDocument();
        doc.Load(Reader);

        XPathNavigator nav = doc.CreateNavigator();
        XmlElement rootNode = doc.DocumentElement;

        XPathExpression expr;

        expr = nav.Compile("//Element[@attribute='somevalue']");
        XPathNodeIterator iterator = nav.Select(expr);

        foreach (XmlElement item in iterator)
        {
          //how do go back to node here (whose element has attribute 'somevalue' and compare with the next node if the attribute 'name' of Node matches
          } ;

2 个答案:

答案 0 :(得分:0)

使用xml linq可以轻松创建所需值的字典

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication93
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            XDocument doc = XDocument.Load(FILENAME);
            Dictionary<string, string> dict = doc.Descendants("Node")
                .GroupBy(x => (string)x.Attribute("name"), y => (string)y.Element("Element").Attribute("attribute"))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

            //or if you have multiple items with same key
            Dictionary<string, List<string>> dict2 = doc.Descendants("Node")
                .GroupBy(x => (string)x.Attribute("name"), y => (string)y.Element("Element").Attribute("attribute"))
                .ToDictionary(x => x.Key, y => y.ToList());

        }

    }


}

答案 1 :(得分:0)

您可以使用linq来执行所需的操作,不确定第二种情况是否能正确理解,但是我将分享第一种情况的示例,它可能会帮助您找到一种好的方法它:

var xml = XDocument.Load("your_xmlFile_path");
var query = from c in xml.Root.Descendants("Node").Descendants("Element")
            where c.Attribute("attribute").Value == "somevalue"
            select c;

我为您测试了该查询,它返回了正确数量的“ somevalue”元素。

编辑 您可以通过替换

来检索名称而不是属性值
c.Attribute("attribute").Value

通过

c.Attribute("attribute").Name

希望这会有所帮助,祝你好运