2011-02-14 22 views
6

Quiero comparar 2 archivos XML.cómo comparar 2 XML usando LINQ en C#

Mi xml1 es:

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

tengo otra XML a partir de la base de datos que es

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

quiero comparar el nodo "libro" de XML1 y el nodo "libro" de XML DB

  1. Tengo un espacio de nombre en el XML que se obtiene de la base de datos
  2. Los nombres de los nodos están en los casos mixtos

quiero comparar estos nodo de archivos 2 XML por el nodo de texto y atributos de valor

estoy usando C# y quería saber si esto es posible usando LINQ

Cualquier ayuda sería muy apreciada

PS Busqué publicaciones similares, pero no pude encontrar lo que estoy buscando exactamente. mucho por adelantado

Saludos, Karthik

+0

Supongamos que los compara ¿cuál es el resultado de la comparación? –

+0

Lo que quiero tener es que, si los valores son diferentes, entonces quiero almacenarlos en un atributo en xml1. Ej: si el valor de ID es diferente, después de la comparación quiero almacenar como 1234 KK99

+1

+1, el problema * general * es interesante es un problema interesante. Sin embargo, no creo que sea una buena aplicación para LINQ. Las herramientas que se me ocurren son 'IEnumerable .Except', que solo será útil para generar nodos que faltan en una/la otra colección. También deberá escribir una comparación personalizada (no estoy seguro de si 'Except' lo admite), y un acoplador de árbol. Los resultados no estarán en un árbol, por lo que puede que tenga que hacer un poco de magia del diccionario para volver a obtener los resultados de sus diferencias en un árbol.¿Te importa si tienes una solución general? –

Respuesta

-2

se puede hacer con bastante facilidad utilizando Linq to XML o incluso simples Xml DOM

Gracias. aunque lo haría valientemente con Regular Expressions. una expresión regular para encontrar todos los libros, y un par de ellos desmantelan cada registro.

6

En xml, el caso y el espacio de nombres son fundamentalmente importantes, y el espacio en blanco y el orden de los atributos no son (lo que hace que las cadenas directas sean incorrectas).

Por lo tanto, IMO debe analizarlo; tal vez con XmlSerializer, pero (como nota) ambos son analizadas trivialmente con 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") 
}; 

entonces es sólo un caso de la comparación de los valores.


Una alternativa es usar algo como XSLT para pre-proceso de uno de los archivos para que coincida con la disposición esperada de la otra, para que pueda compartir código de análisis. Depende de si ya estás familiarizado con xslt.

+0

Muchas gracias. Voy a intentar esto. Dado que mi XML original tiene más nodos, y tampoco quiero darles nombres de nodos, me preguntaba si podría haber algo fácil. – KK99

+0

@Karthik xslt podría ser útil para emparejar nombres de elementos a mayúsculas, pero el requisito es un poco ... inusual. –

+0

Sí cierto :-) Mi preocupación es que en el futuro, puede haber adiciones a nombres XML Node y no quiero que mi código cambie para esto. Comprobaré también XSLT. – KK99