XMLDiff / XMLUnit - 忽略子顺序和使用通配符



我当前在比较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进行相同的操作。

最新更新