2012-07-06 100 views
6

我確信這是基本的,可能之前曾被問到過,但我只是開始使用Linq到XML。Linq to XML - 找到一個元素

我有一個簡單的XML,我需要讀取和寫入。

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

我有一個「文檔」節點,其中包含一堆「文檔」節點。

我有文檔的GUID和「IndexData」名稱。 我需要通過GUID查找文檔,並檢查它是否帶有某個名稱的「IndexData」。 如果它沒有它,我需要添加它。

任何幫助將是apreciated,因爲我有閱讀和搜索槽元素的問題。

目前,我嘗試使用(在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(); 

編輯

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

這將返回任何結果,即使壽xmlDocuments.Element( 「文檔」)一樣。它看起來像我不能從文檔節點獲取文檔節點。

回答

7

您可以在下面的代碼中找到那些文檔(索引數據中沒有相關名稱的文檔),之後您可以將元素添加到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

我認爲這應該是'doc.Descendants( 「文檔」)' – 2012-07-06 06:36:52

+0

謝謝,固定。 – 2012-07-06 06:41:26

0

這應該工作:

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

你好。我知道GUID是錯誤的,但應該視爲簡單的字符串。但我沒有收到任何文件(doc爲空)! – no9 2012-07-06 08:51:31