2012-07-06 12 views
6

Estoy seguro de que esto es básico y probablemente se haya preguntado antes, pero solo estoy comenzando a usar Linq para XML.Linq a XML - Encuentra un elemento

Tengo un XML simple que necesito para leer y escribir.

<Documents> 
... 
    <Document> 
     <GUID>09a1f55f-c248-44cd-9460-c0aab7c017c9-0</GUID> 
     <ArchiveTime>2012-05-15T14:27:58.5270023+02:00</ArchiveTime> 
     <ArchiveTimeUtc>2012-05-15T12:27:58.5270023Z</ArchiveTimeUtc> 
     <IndexDatas> 
     <IndexData> 
      <Name>Name1</Name> 
      <Value>Some value</Value> 
      <DataType>1</DataType> 
      <CreationTime>2012-05-15T14:27:39.6427753+02:00</CreationTime> 
      <CreationTimeUtc>2012-05-15T12:27:39.6427753Z</CreationTimeUtc> 
     </IndexData> 
     <IndexData> 
      <Name>Name2</Name> 
      <Value>Some value</Value> 
      <DataType>3</DataType> 
      <CreationTime>2012-05-15T14:27:39.6427753+02:00</CreationTime> 
      <CreationTimeUtc>2012-05-15T12:27:39.6427753Z</CreationTimeUtc> 
     </IndexData> 
    ... 
</IndexDatas> 
</Document> 
... 
</Documents> 

Tengo un nodo "Documentos" que contiene varios nodos de "Documento".

Tengo un GUID del documento y un nombre "IndexData". Necesito encontrar el documento por GUID y verificar si tiene "IndexData" con algún nombre. Si no lo tiene, necesito agregarlo.

Cualquier ayuda sería apreciada, ya que tengo problemas con la lectura y la búsqueda de elementos a través.

Actualmente estoy tratando de usar (en C#):

IEnumerable<XElement> xmlDocuments = from c in XElement 
             .Load(filePath) 
             .Elements("Documents") 
             select c; 

// fetch document 
XElement documentElementToEdit = (from c in xmlDocuments where 
        (string)c.Element("GUID").Value == GUID select c).Single(); 

EDITAR

xmlDocuments.Element("Documents").Elements("Document") 

Esto devuelve ningún resultado, incluso aunque xmlDocuments.Element ("Documentos") lo hace. Parece que no puedo obtener nodos de documentos del nodo Documentos.

Respuesta

7

Puede encontrar esos documentos (documentos sin nombre relacionado en los datos del índice) con el siguiente código, después de eso, puede agregar sus elementos al final de los elementos IndexData.

var relatedDocs = doc.Elements("Document") 
    .Where(x=>x.Element("GUID").Value == givenValue) 
    .Where(x=>!x.Element("IndexDatas") 
       .Elements("IndexData") 
       .Any(x=>x.Element("Name") == someValue); 
+0

creo que debería ser 'doc.Descendants ("Documento")' –

+0

Gracias, fijo. –

0

Esto debería funcionar:

var x = XDocument.Load(filePath); 
// guid in your sample xml is not a valid guid, so I changed it to a random valid one 
var requiredGuid = new Guid("E61D174C-9048-438D-A532-17311F57ED9B"); 
var requiredName = "Name1"; 

var doc = x.Root 
      .Elements("Document") 
      .Where(d => (Guid)d.Element("GUID") == requiredGuid) 
      .FirstOrDefault(); 
if(doc != null) 
{ 
    var data = doc.Element("IndexDatas") 
        .Elements("IndexData") 
        .Where(d => (string)d.Element("Name") == requiredName) 
        .FirstOrDefault(); 
    if(data != null) 
    { 
     // index data found 
    } 
    else 
    { 
     // index data not found 
    } 
} 
else 
{ 
    // document not found 
} 
+0

hola. GUID está mal, lo sé, pero debería tratarse como una cadena simple. ¡Pero no recibo ningún documento (doc es nulo)! – no9