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

KK9*_*K99 7 c# linq

我想比较2个XML文件.

我的xml1是:

<ROOT><NODE><BOOK><ID>1234</ID><NAME isbn="dafdfad">Numbers: Language of Science</NAME><AUTHOR>Tobias Dantzig</AUTHOR></BOOK></NODE></ROOT>
Run Code Online (Sandbox Code Playgroud)

我有另一个来自数据库的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>
Run Code Online (Sandbox Code Playgroud)

我想比较XML1中的"BOOK"节点和db XML中的"Book"节点

  1. 我在XML中有一个从数据库中获取的名称空间
  2. 节点名称是混合的情况

我想逐个节点地比较这两个XML文件的Text和属性值

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

任何帮助将非常感激

PS我搜索了类似的帖子,但找不到我正在寻找的东西.

非常感谢提前

干杯,Karthik

Mar*_*ell 6

在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")
};
Run Code Online (Sandbox Code Playgroud)

然后它只是比较值的情况.


另一种方法是使用像xslt这样的东西来预处理其中一个文件以匹配另一个文件的预期布局,这样你就可以共享解析代码.我猜,这取决于你是否已经熟悉xslt.


AK_*_*AK_ -2

使用Linq to XML甚至简单的Xml DOM可以很容易地完成。尽管我会勇敢地使用正则表达式来做到这一点。一个正则表达式可以找到所有书籍,并且大约有几个人可以拆除每条记录。