通过C#中的节点名称和属性名称比较XML
本文关键字:属性 比较 XML 节点 通过 | 更新日期: 2023-09-27 18:28:11
我想通过标记名称和属性名称来比较两个(或多个)XML文件。我对属性或节点的值不感兴趣。
在谷歌上搜索我发现了XMLDiff补丁(http://msdn.microsoft.com/en-us/library/aa302294.aspx),但它对我不起作用…或者我不知道如何设置对我起作用。文件A
<info>
<Retrieve>
<LastNameInfo>
<LNameNum attribute="some_val">1</LNameNum>
<NumPeople>1</NumPeople>
<NameType/>
<LName>TEST</LName>
</LastNameInfo>
<Segment>
<SegNum>1</SegNum>
<Comment>A test</Comment>
</Segment>
<Segment>
<SegNum>2</SegNum>
<Dt>20110910</Dt>
<Comment>B test</Comment>
</Segment>
</Retrieve>
</info>
文件B
<info>
<Retrieve>
<LastNameInfo>
<LNameNum attribute="other_val">4</LNameNum>
<NumPeople>1</NumPeople>
<NameType/>
<LName>TEST7</LName>
</LastNameInfo>
<Segment>
<SegNum>1</SegNum>
<Comment>A test</Comment>
</Segment>
<Segment>
<SegNum>2</SegNum>
<Dt>20110910</Dt>
<Comment>B test</Comment>
</Segment>
</Retrieve>
</info>
这两个文件必须相等。
谢谢!
如果你想"手动"完成这项工作,那么可以使用递归函数并在xml结构中循环。这里有一个快速的例子:
var xmlFileA = //first xml
var xmlFileb = // second xml
var docA = new XmlDocument();
var docB = new XmlDocument();
docA.LoadXml(xmlFileA);
docB.LoadXml(xmlFileb);
var isDifferent = HaveDiferentStructure(docA.ChildNodes, docB.ChildNodes);
Console.WriteLine("----->>> isDifferent: " + isDifferent.ToString());
这是您的递归函数:
private bool HaveDiferentStructure(
XmlNodeList xmlNodeListA, XmlNodeList xmlNodeListB)
{
if(xmlNodeListA.Count != xmlNodeListB.Count) return true;
for(var i=0; i < xmlNodeListA.Count; i++)
{
var nodeA = xmlNodeListA[i];
var nodeB = xmlNodeListB[i];
if (nodeA.Attributes == null)
{
if (nodeB.Attributes != null)
return true;
else
continue;
}
if(nodeA.Attributes.Count != nodeB.Attributes.Count
|| nodeA.Name != nodeB.Name) return true;
for(var j=0; j < nodeA.Attributes.Count; j++)
{
var attrA = nodeA.Attributes[j];
var attrB = nodeB.Attributes[j];
if (attrA.Name != attrB.Name) return true;
}
if (nodeA.HasChildNodes && nodeB.HasChildNodes)
{
return HaveDiferentStructure(nodeA.ChildNodes, nodeB.ChildNodes);
}
else
{
return true;
}
}
return false;
}
请记住,只有当节点和属性的顺序相同,并且两个xml文件使用相同的大小写时,才会返回true。您可以增强它以包括或排除属性/节点。
希望它能有所帮助!