2016-10-05 58 views
0

我想通過節點或屬性的值來比較兩個(或更多)XML文件。我對節點名稱或屬性不感興趣。通過C#中節點或屬性的值比較Xml

在谷歌上搜索我發現XMLDiff補丁(http://msdn.microsoft.com/en-us/library/aa302294.aspx),但它不適合我..或者我不知道如何使設置爲我工作。

FILEA

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

我想驗證的每個節點或屬性的值。 謝謝!

+1

的可能的複製[如何比較兩個XML文檔?](http://stackoverflow.com/questions/167946/how-would-you-compare-two-xml-documents) – Balaji

+0

http://stackoverflow.com/questions/9750879/comparing -xml-by-nodes-names-and-attributes -in -c-sharp – Balaji

+0

我不想驗證結構。是否有可能驗證每個節點的值。@ Balaji – Mahek

回答

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(); 
} 


}