2012-07-06 36 views
6

Tôi chắc chắn rằng điều này là cơ bản và có thể đã được hỏi trước đây, nhưng tôi chỉ bắt đầu sử dụng LINQ to XML.LINQ to XML - Tìm một phần tử

Tôi có một XML đơn giản mà tôi cần đọc và ghi.

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

Tôi có nút "Tài liệu" chứa các nút "Tài liệu".

Tôi có GUID của tài liệu và tên "IndexData". Tôi cần tìm tài liệu bằng GUID và kiểm tra xem nó có "IndexData" với một số tên không. Nếu không có, tôi cần thêm nó.

Bất kỳ trợ giúp nào đều được đề xuất, vì tôi gặp sự cố khi đọc và tìm kiếm các phần tử máng.

Hiện nay tôi đang cố gắng sử dụng (trong 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(); 

EDIT

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

này trả về không có kết quả, thậm chí tho xmlDocuments.Element ("Tài liệu") thực hiện. Có vẻ như tôi không thể nhận các nút Tài liệu từ nút Tài liệu.

Trả lời

7

Bạn có thể tìm thấy các tài liệu đó (tài liệu không có tên liên quan trong dữ liệu chỉ mục) bằng mã bên dưới, sau đó bạn có thể thêm các phần tử vào cuối các phần tử 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

Tôi nghĩ rằng nên được 'doc.Descendants ("Tài liệu")' –

+0

Cảm ơn, cố định. –

0

này nên làm việc:

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

xin chào. GUID là sai tôi biết, nhưng nên được coi là chuỗi đơn giản. Nhưng tôi không nhận được bất kỳ tài liệu (doc là null)! – no9

Các vấn đề liên quan