2015-06-21 99 views
0

昨天晚上,我提出了一個關於如何通過重複XML結構進行解析的問題。 XML有兩個重複的級別,第二級包含我需要在其他地方存儲的元素。在c#中使用Linq to XML解析XML的示例

該問題被標記爲重複項,並指出基本上聲明'使用Linq to XML'的接受答案。

雖然我很欣賞答案,但我的問題的底部說明了我試圖理解如何使用LINQ to XML,但無法弄清楚如何訪問第二級數據。

是否有任何關於如何使用LINQ to XML或任何其他方法來獲取XML文檔中的信息並能夠循環訪問的示例或教程?

我已經在Perl中完成了這項工作,它基本上吸收了XML並創建了一個可以遍歷的大對象。

鏈接到原來的問題:Parsing XML with C Sharp

+0

你可以在這裏找到一個教程:http://www.codeproject.com/Articles/24376/LINQ-to-XML – hdoghmen

+3

歡迎棧溢出。這個問題可能也會被關閉,因爲要求鏈接到資源的問題是不鼓勵的(他們會過快地過期)。提出這樣一個問題的最好方法是提供一個簡單示例的代碼,用於完成您可以執行的部分,然後詢問如何添加缺少的部分。請參閱http://stackoverflow.com/help/how-to-ask –

回答

0

他們說 「實踐使完美」。有時候做某些事情是最好的學習方法。在代碼中使用LINQ法「ToList()」像下面

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string input = 
       "<Data>" + 
        "<Report>" + 
        "<Machine name=\"hostA\">" + 
         "<MachineInfo location=\"LA\">" + 
         "<function name=\"run\">Late</function>" + 
         "<function name=\"status\">Complete</function>" + 
         "<function name=\"date\">2015-06-14</function>" + 
         "</MachineInfo>" + 
         "<RepItem name=\"1488\" direction=\"NS\">" + 
         "<Desc>None Found</Desc>" + 
         "<Status Int=\"A12\">Uplink</Status>" + 
         "</RepItem>" + 
         "<RepItem name=\"1489\" direction=\"S\">" + 
         "<Desc>31Ghz Ant at 285ft.</Desc>" + 
         "<Status Int=\"D5\">Active</Status>" + 
         "</RepItem>" + 
         "<RepItem name=\"1438\" direction=\"W\">" + 
         "<Desc>West N. Oc. Backup</Desc>" + 
         "<Status Int=\"A11\">Disabled</Status>" + 
         "</RepItem>" + 
         "<RepItem name=\"1141\" direction=\"SE\">" + 
         "<Desc>MDT Co.</Desc>" + 
         "<Status Int=\"B7\">Active</Status>" + 
         "</RepItem>" + 
        "</Machine>" + 
        "<Machine name=\"hostB\">" + 
         "<MachineInfo location=\"E. LA\">" + 
         "<function name=\"run\">Late</function>" + 
         "<function name=\"status\">Complete</function>" + 
         "<function name=\"date\">2015-06-14</function>" + 
         "</MachineInfo>" + 
         "<RepItem name=\"1488\" direction=\"NS\">" + 
         "<Desc>None Found</Desc>" + 
         "<Status Int=\"A12\">Down</Status>" + 
         "</RepItem>" + 
         "<RepItem name=\"1489\" direction=\"S\">" + 
         "<Desc>31Ghz Ant at 285ft.</Desc>" + 
         "<Status Int=\"D5\">Active</Status>" + 
         "</RepItem>" + 
         "<RepItem name=\"1438\" direction=\"W\">" + 
         "<Desc>West N. Oc. Backup</Desc>" + 
         "<Status Int=\"A11\">Disabled</Status>" + 
         "</RepItem>" + 
         "<RepItem name=\"1141\" direction=\"SE\">" + 
         "<Desc>MDT Co.</Desc>" + 
         "<Status Int=\"B7\">Active</Status>" + 
         "</RepItem>" + 
        "</Machine>" + 
        "</Report>" + 
       "</Data>"; 

      XDocument doc = XDocument.Parse(input); 
      var results = doc.Descendants("Machine") 
       .Select(x => new { 
        name = x.Attribute("name").Value, 
        info = new { 
         machineInfo = x.Element("MachineInfo").Attribute("location").Value, 
         functions = x.Element("MachineInfo").Elements("function").Select(y => y.Value).ToList() 
        }, 
        repItems = x.Elements("RepItem") 
         .Select(y => new { 
          name = y.Attribute("name").Value, 
          direction = y.Attribute("direction").Value, 
          description = y.Element("Desc").Value, 
          status = y.Element("Status").Value, 
          index = y.Element("Status").Attribute("Int").Value 
         }).ToList() 
       }) 
       .ToList(); 
     } 
    } 
} 
​ 
+0

後代,元素和屬性具有單數和複數形式。當一個標籤出現多次,然後使用複數方法,然後選擇「選擇」,然後用上面代碼中的List()方法關閉。 – jdweng