2013-06-23 69 views
0

我正在處理從XML文檔訪問特定節點。我意識到這是一個基本的命名空間。這裏是例子。如何使用名稱空間獲取xml中的特定節點?

enter image description here

我感興趣得到節點d的值:從所有的子節點(項)MediaUrl。我還沒有完成。

當調試變量迭代器「我」,我可以看到,XML也包括默認的命名空間,像:

<entry xmlns="http://schemas.microsoft.com.ado/..." 

而且我也必須包括所謂的「d」另一個命名空間。

我能做些什麼來訪問特定節點?

這就是我所擁有的。

 var doc = XDocument.Parse(result); 

     string BASE_NS = "http://www.w3.org/2005/Atom"; 

     string d = "http://schemas.microsoft.com/ado/2007/08/dataservices"; 
     var query = from i in doc.Descendants(XName.Get("entry", BASE_NS)) 
        select new Image() 
     { 
      Url = i.Element(XName.Get("MediaUrl", BASE_NS)).Value 
     }; 

     var results = query.ToList(); 
+1

此外,你選擇將無法正常工作,因爲「MediaURL」不是「Entry」的子項,它是「縮略圖」 - 「i.Element(」content「)的子元素。 .Element(「Thumbnail」)。元素(「MediaUrl」)'(爲了簡潔省略了命名空間)。 – Tim

+0

謝謝蒂姆。 'i.Element(「content」)不幸的是返回null,是否必須包含任何名稱空間? –

+0

是否要從每個「條目」或所有「MediaUrl」元素?每個條目中有兩個 - 屬性下,縮略圖下一個。 – Tim

回答

1

我會建議使用XNamespace而非XName(個人喜好,主要是 - 因爲這是我怎麼總處理命名空間在LINQ to XML)。對我來說,預先設置命名空間並使用Element(NS + "element name") than to use XName.Get (though using XName.Get`完全沒問題,如果這就是你想要做的。

如果你想獲得一個所有「MediaUrl」爲每個條目的元素,那麼我會做這樣的事情:

XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices"; 

var query = (from i in doc.Descendants(d + "MediaUrl") 
      select new Image() 
      { 
       Url = i.Value 
      }).ToList(); 

如果你想只是其中之一,那麼你需要做一些有點不同的事情,取決於你想得到哪一個。

有關屬性MediaUrl:

XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices"; 
XNamespace m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"; 

var query = (from i in doc.Descendants(m + "properties") 
      select new Image() 
      { 
       Url = i.Element(d + "MediaUrl").Value 
      }).ToList(); 

對於縮略圖MediaUrl:

XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices"; 

var query = (from i in doc.Descendants(d + "Thumbnail") 
      select new Image() 
      { 
       Url = i.Element(d + "MediaUrl").Value 
      }).ToList(); 

這裏的關鍵是爲了找回它與該元素的名稱使用的名稱空間結合。

0
var query = from i in doc.Descendants("{full namespace for prefix d}MediaUrl") 
        select new Image() 
     { 
      Url = i.Value 
     }; 
相關問題