【问题标题】:Comparing Xml by values of nodes or attributes in C#通过 C# 中节点或属性的值比较 Xml
【发布时间】:2016-10-05 06:35:12
【问题描述】:

我想通过节点或属性的值来比较两个(或多个)XML 文件。我对节点名称或属性不感兴趣。

在 google 上搜索我找到了 XMLDiff Patch (http://msdn.microsoft.com/en-us/library/aa302294.aspx),但它对我不起作用..或者我不知道如何进行设置以适合我。

文件A

  <Root odata.context="http://services.odata.org/V4/(S(i53ojihzxawmvtyyvztbaelk))/TripPinServiceRW/$metadata">
  <value>
    <name>Photos</name>
    <kind>EntitySet</kind>
    <url>Photos</url>
  </value>
  <value>
    <name>People</name>
    <kind>EntitySet</kind>
    <url>People</url>
  </value>
  <value>
    <name>Airlines</name>
    <kind>EntitySet</kind>
    <url>Airlines</url>
  </value>
  <value>
    <name>Airports</name>
    <kind>EntitySet</kind>
    <url>Airports</url>
  </value>
  <value>
    <name>Me</name>
    <kind>Singleton</kind>
    <url>Me</url>
  </value>
  <value>
    <name>GetNearestAirport</name>
    <kind>FunctionImport</kind>
    <url>GetNearestAirport</url>
  </value>
</Root>

文件 B

<Root odata.context="http://services.odata.org/V4/(S(i53ojihzxawmvtyyvztbaelk))/TripPinServiceRW/$metadata">
  <value>
    <name>Photos</name>
    <kind>EntitySet</kind>
    <url>Photos</url>
  </value>
  <value>
    <name>People</name>
    <kind>EntitySet</kind>
    <url>People</url>
  </value>
  <value>
    <name>Airlines</name>
    <kind>EntitySet</kind>
    <url>Airlines</url>
  </value>
  <value>
    <name>Airports</name>
    <kind>EntitySet</kind>
    <url>Airports</url>
  </value>
  <value>
    <name>Me</name>
    <kind>Singleton</kind>
    <url>Me</url>
  </value>
  <value>
    <name>GetNearestAirport</name>
    <kind>FunctionImport</kind>
    <url>GetNearestAirport</url>
  </value>
</Root>

我想验证每个节点或属性的值。 谢谢!

【问题讨论】:

标签: c# xml xml-validation xmldiff


【解决方案1】:

如果您想自己做,并且 xml 文档的结构是已知且不变的,您可以这样做(假设 xdocB 是有效文档):

class NodeComparer : IEqualityComparer<XmlNode>
{
  public bool Equals(XmlNode x, XmlNode y)
  {
    if (x == null || y == null)
      return false;

    if (x.ChildNodes.Count != y.ChildNodes.Count)
      return false;

    var nodeNames = new [] { "name", "kind", "url" };

    for (int i = 0; i < x.ChildNodes.Count; i++)
    {
      foreach (var nodeName in nodeNames)
      {
        if (!x[nodeName].InnerText.Equals(y[nodeName].InnerText))
          return false;
      }
    }

    // TODO some testing of attributes

    return true;
  }

  public int GetHashCode(XmlNode obj)
  {
    return 1;
  }
}

static void Main(string[] args)
{
  XmlDocument xdocA = new XmlDocument();
  xdocA.Load(pathA);
  XmlDocument xdocB = new XmlDocument();
  xdocB.Load(pathB);

  var nodesA = xdocA.SelectNodes("Root/value").Cast<XmlNode>();
  var nodesB = xdocB.SelectNodes("Root/value").Cast<XmlNode>();

  var comp = new NodeComparer();
  var errors = nodesA.Where(na => !nodesB.Contains(na, comp));

  if (errors.Count() > 0)
  {
    Console.WriteLine("ERRORS: ");
    foreach (var error in errors)
    {
      Console.WriteLine(string.Join(", ", error.Cast<XmlNode>().Select(xn => $"{xn.Name}: {xn.InnerText}")));
      Console.WriteLine();
    }
  }
  else
  {
    Console.WriteLine("No Errors");
  }

  Console.ReadLine();
}


}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多