2014-06-17 33 views
2

我有以下XML文件:如何提取標籤的每一次出現在一個XML文件

<queryResponse xmlns=""> 
    <querySubjectResponse xmlns=""> 
     ... 
     <report> 
      <informationReported> 
       <aar> 
        <narrative>THIS IS A TEST NARRATIVE</narrative> 
       </aar> 
      </informationReported> 
      ... 
      <statement> 
       <subjectStatement> 
        <statement>THIS IS A TEST STATEMENT</statement> 
       </subjectStatement> 
      </statement> 
      ... 
     </report> 
     ... 
     <report> 
      <informationReported> 
       <aar> 
        <narrative>THIS IS A TEST NARRATIVE2</narrative> 
       </aar> 
      </informationReported> 
      ... 
      <statement> 
       <subjectStatement> 
        <statement>THIS IS A TEST STATEMENT2</statement> 
       </subjectStatement> 
      </statement> 
      ... 
     </report> 
     ... 
     <report> 
      <informationReported> 
       <aar> 
        <narrative>THIS IS A TEST NARRATIVE3</narrative> 
       </aar> 
      </informationReported> 
      ... 
      <statement> 
       <subjectStatement> 
        <statement>THIS IS A TEST STATEMENT3</statement> 
       </subjectStatement> 
      </statement> 
      ... 
     </report> 
     ... 
    </querySubjectResponse> 
</queryResponse> 

我一直在尋找的LINQ to XML但我不知道如何實現它。我想保存敘述和每個敘述,將這個敘述保存到一個數組中以備後用。

例子:

THIS IS A TEST NARRATIVE 
THIS IS A TEST STATEMENT 

THIS IS A TEST NARRATIVE2 
THIS IS A TEST STATEMENT2 

THIS IS A TEST NARRATIVE3 
THIS IS A TEST STATEMENT3 

如何實現的呢?

我使用XDocument加載文件:

XDocument X = XDocument.Load("myfile.xml"); 
var main = x.Element("queryResponse").Element("querySubjectResponse").Element("report").Element("informationReported").Element("aar"); 

我試圖按照此鏈接中的答案:Linq to XML

+0

「*我想保存的敘述和每個敘述,保存語句到一個數組中供以後使用。*」''不包含''。你的意思是你想要在包含''的''中保存''嗎?你也嵌套''s,你想要最內層的嗎?這個問題並不清楚,你也不會顯示任何嘗試,除此之外,你將它作爲'XDocument'加載它。 – clcto

+0

我更新了我想要保存的問題,並且還能夠獲取元素並將其保存到'var',但不太確定事後如何繼續。 – Si8

回答

3

這應該爲你假定每個報告的工作文字說明,並可選聲明:

XElement root = XElement.Load(file); 
List<string> list = root.Descendants("report") 
    .SelectMany(report => 
    { 
     List<string> sub = new List<string>(); 
     sub.Add(report.Descendants("narrative").First().Value); 
     string statement = (string)report.Descendants("statement") 
         .FirstOrDefault(s => s.Elements().Any() == false); 
     sub.Add(statement ?? "NULL"); 
     return sub; 
    }) 
    .ToList(); 

如果你想在不同的列表中的敘述和說明,而是執行此操作:

var list = root.Descendants("report") 
    .Select(report => new 
    { 
     Narrative = report.Descendants("narrative").First().Value, 
     Statement = ((string)report.Descendants("statement") 
         .FirstOrDefault(s => s.Elements().Any() == false)) 
        ?? "NULL" 
    }) 
    .ToList(); 
+0

對於第二種或第一種選擇,是否可以將敘述和陳述包含在不同的列表中? – Si8

+0

也爲此代碼:'sub.Add(report.Descendants(「statement」) .Where(statement => statement.Elements()。Any()== false) .First()。Value);'我得到'Sequence contains no elements' error。 – Si8

+0

@ SiKni8那麼不是每個報告都包含一個聲明。 –

相關問題