1

我目前在比较 2 个 xmls 时遇到一个问题 - 原始和差异参考。问题是当我尝试应用通配符与不同的子顺序进行比较时 - 另外,这些子节点在节点中可能具有不同数量的属性,因此比较更加困难。

我尝试使用适用于 .NET 的 XMLUnit 和 XMLDiff 库来实现解决方案,但没有成功。

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>

.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>

我还没有找到解决方案,所以请帮助我。

4

2 回答 2

1

我想它会帮助你

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);
于 2018-08-02T10:19:44.060 回答
0

尝试运行这个:

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 执行相同的操作。

于 2017-09-15T12:34:04.320 回答