2012-04-10 19 views
6

mi archivo XML:seleccione XML Nodo usando LINQ to XML

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfCustomer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Customer> 
     <CustomerId>1f323c97-2015-4a3d-9956-a93115c272ea</CustomerId> 
     <FirstName>Aria</FirstName> 
     <LastName>Stark</LastName> 
     <DOB>1999-01-01T00:00:00</DOB> 
    </Customer> 
    <Customer> 
     <CustomerId>c9c326c2-1e27-440b-9b25-c79b1d9c80ed</CustomerId> 
     <FirstName>John</FirstName> 
     <LastName>Snow</LastName> 
     <DOB>1983-01-01T00:00:00</DOB> 
    </Customer> 
</ArrayOfCustomer> 

mi intento:

XElement toEdit = 
    (XElement)doc.Descendants("ArrayOfCustomer") 
       .Descendants("Customer") 
       .Where(x => Guid.Parse((x.Descendants("CustomerId") as XElement).Value) == customer.CustomerId) 
       .First<XElement>(); 

esto arroja la siguiente excepción:

Object reference not set to an instance of an object. 

1) no es x un XElement?

2) ¿Es esto correcto que lambda para seleccionar un nodo Xml?

3) y, por supuesto, ¿cómo encontrarías este nodo según CustomerId?

+0

i consiguió por primera vez la excepción: No se puede convertir objeto de tipo 'WhereEnumerableIterator'1 [Sistema .Xml.Linq.XElement] 'para escribir' System.Xml.Linq.XElement '. esto fue porque intenté convertir desde IEnumrable a un único XElement, agregué una primera extensión (). ahora simplemente no puede distinguir x como un XElement. –

Respuesta

4

Su problema es que Descendents y Where no devuelve un IEnumerable<XElement> una sola XElement que es lo que está buscando. Puedes solucionar este problema como éste:

XElement toEdit = doc.Descendants("ArrayOfCustomer") 
        .Descendants("Customer") 
        .Where(x => Guid.Parse(x.Descendants("CustomerId").Single().Value) == customer.CustomerId) 
        .FirstOrDefault(); 
+0

Solo tenga en cuenta que esto requiere que haya un solo elemento CustomerId debajo de un Cliente. Si hay 0 o> 1 lanzará una excepción. Y después de mirar su XML, probablemente sea apropiado. Pero solo algo para señalar. –

+0

@AndrewFinnell, mientras estábamos en el tema, ¿cómo haría para editar ese nodo, ahora puedo actualizar todos los decesos del Cliente (XElement) , pero cómo actualizaría el nodo en el archivo? –

2

No está emitiendo x está emitiendo x.Descendants(). x.Descendants() devuelve una colección, de ahí el método plural semántico. De la parte superior de la cabeza que debe ser capaz de hacer x.Descendants("CustomerId").FirstOrDefault() as XElement

1
XElement toEdit = (from c in doc.Descendants("Customer") 
    where Guid.Parse(c.Value) == customer.CustomerId 
    select c).SingleOrDefault(); 
1

Me reestructurar su consulta como esta:

XElement toEdit = doc.Descendants("Customer") 
         .Where(x => (Guid)x.Element("CustomerId") == customer.CustomerId) 
         .FirstOrDefault();