我目前在比较2个xmls时遇到了一个问题--原始的和引用的差异。问题是,当我尝试应用通配符与不同的子节点顺序进行比较时-另外,这些孩子在一个节点中可能具有不同数量的属性,因此比较更加困难。
我试图使用XMLUnit和XMLDiff库为.NET实现一个解决方案,但没有成功。
using System;
using Org.XmlUnit.Builder;
using Org.XmlUnit.Diff;
using System.IO;
static void Main(string[] args)
{
string orgFilePath = @"C:\Temp\original.xml";
string refFilePath = @"C:\Temp\reference.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>组织文件:
<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>我还没有找到解决方案,所以请帮我解决这个问题。
发布于 2018-08-02 18:19:44
我想这会对你有帮助的
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);发布于 2017-09-15 20:34:04
尝试运行以下命令:
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执行相同的操作。
https://stackoverflow.com/questions/46239072
复制相似问题