簡體   English   中英

如何在C#中使用LINQ比較2 XML

[英]how to compare 2 XML using LINQ in C#

我想比較2個XML文件。

我的xml1是:

<ROOT><NODE><BOOK><ID>1234</ID><NAME isbn="dafdfad">Numbers: Language of Science</NAME><AUTHOR>Tobias Dantzig</AUTHOR></BOOK></NODE></ROOT>

我有另一個來自數據庫的XML

<Book xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Id>12345</Id><Name isbn="31231223">Numbers: Language of Science</Name><Author>Tobias Dantzig</Author></Book>

我想比較XML1中的“BOOK”節點和db XML中的“Book”節點

  1. 我在XML中有一個從數據庫中獲取的名稱空間
  2. 節點名稱是混合的情況

我想逐個節點地比較這兩個XML文件的Text和屬性值

我正在使用C#並想知道使用LINQ是否可行

任何幫助將非常感激

PS我搜索了類似的帖子,但找不到我正在尋找的東西。

非常感謝提前

干杯,Karthik

在xml中,case和namespace非常重要,而whitespace和attribute-order 則不然 (使得直接字符串比較不正確)。

所以IMO你應該解析它; 也許使用XmlSerializer ,但(正如您所注意到的)兩者都使用LINQ-to-XML進行了簡單的解析:

string xml1 = @"<ROOT><NODE><BOOK><ID>1234</ID><NAME isbn=""dafdfad"">Numbers: Language of Science</NAME><AUTHOR>Tobias Dantzig</AUTHOR></BOOK></NODE></ROOT>";

var book1 = (from book in XElement.Parse(xml1).Elements("NODE").Elements("BOOK")
            let nameEl = book.Element("NAME")
            select new
            {
                Id = (int)book.Element("ID"),
                Name = nameEl.Value,
                Isbn = (string)nameEl.Attribute("isbn"),
                Author = (string)book.Element("AUTHOR")
            }).Single();

string xml2 = @"<Book xmlns:rdf=""http://www.w3.org/1999/02/22-rdf-syntax-ns#""><Id>12345</Id><Name isbn=""31231223"">Numbers: Language of Science</Name><Author>Tobias Dantzig</Author></Book>";
var el = XElement.Parse(xml2);
var book2 = new
{
    Id = (int)el.Element("Id"),
    Name = el.Element("Name").Value,
    Isbn = el.Element("Name").Attribute("isbn"),
    Author = el.Element("Author")
};

然后它只是比較值的情況。


另一種方法是使用像xslt這樣的東西來預處理其中一個文件以匹配另一個文件的預期布局,這樣你就可以共享解析代碼。 我猜,這取決於你是否已經熟悉xslt。

可以使用Linq to XML甚至簡單的Xml DOM輕松完成。 雖然我會用正則表達式勇敢地做到這一點。 一個正則表達式找到所有書籍,並且幾個左右的每個記錄都要拆除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM