我有一个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
} ;
答案 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
希望这会有所帮助,祝你好运