2012-10-03 92 views
4

所以我有一些XML通常看起來像這樣與使用LINQ to XML前綴名字空間查詢XML子元素

<wd:Data xmlns:wd="urn:com.foo.bar/GetResult"> 
    <wd:Result> 
     <wd:field1>lorem</wd:field1> 
     <wd:field2>ipsum</wd:field2> 
     <wd:field3>dolor</wd:field3> 
     <wd:field4>sit</wd:field4> 
    </wd:Result> 
</wd:Data> 

命名空間的前綴是「WD」

我希望能夠取每個元件內<wd:Result>...</wd:Result>並創建一個新KeyValuePair<string, string>其中鍵是元素名稱和值是元件的像這樣的值:

{「FIELD1」,「LOREM」} {「FIELD2」 ,「ipsum」} {「field3」,「dolor」} {「field4」,「sit」}

我的努力與命名空間前綴。我非常LINQ的新手,但我一直都能夠得到這樣的代碼工作是這樣的:

var data = XElement.Parse(theXml); 
XNamespace ns = "urn:com.foo.bar/GetResults"; 
var result = data.Elements(ns + "Result") 
       .Select(x => new KeyValuePair<string, string>(x.Name.LocalName, x.Value)) 
       .ToList(); 

我應該如何查詢該數據以產生期望的結果呢?

我沒有和LINQ結婚,所以無論社區感覺怎麼樣都是最好的。

+0

命名空間? –

回答

5

事實證明,我需要的元素後裔()相結合( )

下面的代碼來達到的正是我在後:

var data = XElement.Parse(theXml); 
    XNamespace ns = "urn:com.foo.bar/GetResults"; 
    var result = data.Descendants(ns + "Result") 
        .Elements() 
        .Select(x => new KeyValuePair<string, string>(x.Name.LocalName, x.Value)) 
        .ToList(); 
+0

很高興看到你找到解決方案給你的問題 –

+0

這節省了我很多時間。感謝張貼您的答案 –

2

確定這是不是一個完整的解決方案,但我覺得你應該避開使用XML命名空間內,並讀取數據與LINQ基本思路

免得說你已經加載到內存中的XML,這裏怎麼可能u訪問該

XDocument inventory = XDocument.Load("path_to_your_file.xml"); 

XNamespace vs = "urn:com.foo.bar/GetResult"; 
var names = doc.Descendants(vs + "Result") 
      .Select(x => (string) x) 
      .ToList(); 

這是不是你的XML結構的具體實現,但我覺得你的想法如何與命名空間的工作

+0

謝謝。你的代碼片段讓我想到,我需要調用Elements()*之後*我得到了ns +的所有後裔「結果」 – syneptody

0

你也可以使用localName屬性,做你是否意識到,你的問題無關,像這樣的東西

var names = from n in xdoc.Descendants() where n.Name.LocalName == "Result" select n;