2009-04-15 27 views
31

¿Cómo obtener un elemento XML de XDocument utilizando LINQ?Cómo obtener el nodo XML de XDocument

Supongamos que tengo un nombre XMLDoc XDocument que se muestra a continuación:

<Contacts> 
     <Node> 
      <ID>123</ID> 
      <Name>ABC</Name> 
     </Node> 
     <Node> 
      <ID>124</ID> 
      <Name>DEF</Name> 
     </Node> 
</Contacts> 

XElement Contacts = from xml2 in XMLDoc.Elements("Contacts").Elements("Node") 
        where xml2.Element("ID").Value == variable 
        select xml2; 

Pero estoy recibiendo un error "objeto de referencia no es establecer ....."

¿Cómo obtener una determinada Nodo de un archivo XML usando LINQ? Y quiero actualizar algunos valores en ese nodo?

¿Cómo es posible ???

Gracias de antemano .........

Respuesta

11

La operación .Elements devuelve una lista de XElements - pero lo que realmente quiere es un elemento único. Añadir lo siguiente:

XElement Contacts = (from xml2 in XMLDoc.Elements("Contacts").Elements("Node") 
        where xml2.Element("ID").Value == variable 
        select xml2).FirstOrDefault(); 

De esta manera, usted le dice LINQ para darle la primera (o NULL, si no hay ninguno allí) de esa lista de XElements que está seleccionando.

Marc

+2

Su edición ha sido clara. Cae presa del error clásico de intentar usar la consulta como el conjunto de resultados. http://stackoverflow.com/questions/594919/a-question-about-linq-to-sql/594975#594975 Mi respuesta a una pregunta similar –

+0

Hola, gracias por la respuesta. Pero sigo recibiendo el error ....... A través de esta consulta, ¿cómo puedo agregar nuevos nodos, actualizar y eliminar el nodo en un XDocument ???? –

+1

Si desea agregar elementos nuevos, debe obtener el XElement al que desea agregar algo. ¿Qué quieres hacer? No se puede hacer todo a través de una sola consulta ... –

66

Respuesta a additional question Publicado por OP.

test.xml:

<?xml version="1.0" encoding="utf-8"?> 
<Contacts> 
    <Node> 
    <ID>123</ID> 
    <Name>ABC</Name> 
    </Node> 
    <Node> 
    <ID>124</ID> 
    <Name>DEF</Name> 
    </Node> 
</Contacts> 

seleccionar un solo nodo:

XDocument XMLDoc = XDocument.Load("test.xml"); 
string id = "123"; // id to be selected 

XElement Contact = (from xml2 in XMLDoc.Descendants("Node") 
        where xml2.Element("ID").Value == id 
        select xml2).FirstOrDefault(); 

Console.WriteLine(Contact.ToString()); 

eliminar un solo nodo:

XDocument XMLDoc = XDocument.Load("test.xml"); 
string id = "123"; 

var Contact = (from xml2 in XMLDoc.Descendants("Node") 
       where xml2.Element("ID").Value == id 
       select xml2).FirstOrDefault(); 

Contact.Remove(); 
XMLDoc.Save("test.xml"); 

Añadir nuevo nodo:

XDocument XMLDoc = XDocument.Load("test.xml"); 

XElement newNode = new XElement("Node", 
    new XElement("ID", "500"), 
    new XElement("Name", "Whatever") 
); 

XMLDoc.Element("Contacts").Add(newNode); 
XMLDoc.Save("test.xml"); 

También hay un muy buen tutorial para XMLs análisis sintáctico here. Espero eso ayude.

Cuestiones relacionadas