我当前在比较2个XML时遇到问题 - 原始和参考差异。问题是当我尝试将通配符与不同的子命令进行比较时 - 其他这些孩子可能在节点中具有不同数量的属性,因此比较更难。
我尝试使用XMLUNIT&xmldiff库,但没有任何成功。
using System;
using Org.XmlUnit.Builder;
using Org.XmlUnit.Diff;
using System.IO;
static void Main(string[] args)
{
string orgFilePath = @"C:Temporiginal.xml";
string refFilePath = @"C:Tempreference.xml";
StreamReader orgStreamReader = new StreamReader(orgFilePath);
StreamReader refStreamReader = new StreamReader(refFilePath);
String orgFile = XDocument.Load(orgStreamReader).ToString();
String refFile = XDocument.Load(refStreamReader).ToString();
var diff = DiffBuilder
.Compare(Input.FromString(orgFile))
.WithTest(Input.FromString(refFile))
.CheckForSimilar()
.Build();
foreach (var d in )
{
Console.WriteLine(d.Comparison);
Console.WriteLine();
}
Console.WriteLine(diff.Differences);
Console.ReadLine();
}
参考文件:
<deviceOrders>
<deviceOrder>
<operation>New</operation>
<moduleId>*</moduleId>
<net>TST</net>
<sort>VT</sort>
<moduleNr>220</moduleNr>
<deviceNr>0</deviceNr>
</deviceOrder>
<deviceOrder>
<operation>New</operation>
<moduleId>*</moduleId>
<net>79ST</net>
<sort>UP</sort>
<deviceNr>0</deviceNr>
</deviceOrder>
</deviceOrders>
org文件:
<deviceOrders>
<deviceOrder>
<operation>New</operation>
<moduleId>1235</moduleId>
<net>79ST</net>
<sort>UP</sort>
<deviceNr>0</deviceNr>
</deviceOrder>
<deviceOrder>
<operation>New</operation>
<moduleId>1234</moduleId>
<net>TST</net>
<sort>VT</sort>
<moduleNr>220</moduleNr>
<deviceNr>0</deviceNr>
</deviceOrder>
</deviceOrders>
我还没有找到解决方案,所以请帮助我。
我认为这会帮助您
Diff d = DiffBuilder.Compare(Input.FromFile("doc1.xml"))
.WithTest(Input.FromFile("doc2.xml")).WithNodeFilter(x=>!x.Name.Equals("NodeName")).Build();
Assert.IsFalse(d.HasDifferences());
或
ISource control = Input.FromFile("doc1.xml").Build();
ISource test = Input.FromFile("doc2.xml").Build();
IDifferenceEngine diff = new DOMDifferenceEngine();
diff.NodeFilter = x => !x.Name.Equals("NodeName");
diff.DifferenceListener += (comparison, outcome) => {
Assert.Fail("found a difference: {0}", comparison);
};
diff.Compare(control, test);
尝试运行以下操作:
using System;
using System.Reflection;
using System.Linq;
using System.Xml.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string xml1 = "<?xml version="1.0" encoding="UTF - 8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>";
string xml2 = "<?xml version="1.0" encoding="UTF - 8"?> <note> <to>dd22</to> <from>Jani</from> <heading>4fewfewe</heading> <body>Don't forget me this weekend!</body> </note>";
XDocument doc1 = XDocument.Parse(xml1);
XDocument doc2 = XDocument.Parse(xml2);
Console.WriteLine("Elements in document 1");
foreach (string Different in doc1.Elements().Elements().Select(x => x.Value))
{
Console.WriteLine("1----"+Different);
}
Console.Read();
Console.WriteLine("Elements in document 2");
foreach (string Different in doc2.Elements().Elements().Select(x => x.Value))
{
Console.WriteLine("2----" + Different);
}
Console.Read();
Console.WriteLine("These are the equal elements, I will discard different ones");
foreach (string Different in doc1.Elements().Elements().Select(x => x.Value).Intersect(doc2.Elements().Elements().Select(x => x.Value)))
{
Console.WriteLine(Different);
}
Console.Read();
}
}
}
它将仅检索相等的元素。修改foreach中的linq以获取所需的东西。
它在其后代运行的元素级别上进行节点值的相交。您可以对XML进行相同的操作。