2012-05-22 204 views
0

我發現了很多關於這個主題的例子和問題,但是我試過的結果是空白的。使用LINQ解析XML流

從xml中我需要從那裏得到第一個'listing'元素,我只需要顯示名稱和地址信息。

sample image

var listings = from c in xdoc.Elements("listing") select c; 

回答

3

你缺少你查詢的命名空間。節點的名稱是不是listing它的命名空間+ listing

所以,你需要得到wp元素的命名空間,或使用本地名稱屬性:

var listings = from c in xdoc.Descendants() 
       where c.Name.LocalName == "listing" 
       select c; 

,或者你需要得到的命名空間和它添加到查詢

XNamespace ns = // namespace name here 
var listings = from c in xdoc.Descendants(ns + "listing") select c; 

listing將被定義爲IEnumerable<XElement>一些變化。確切的類型將根據您使用的查詢而有所不同,但重要的部分是它將從IEnumerable<>派生。

另一個問題是您使用Elements()方法。 Elements()將僅搜索由xdoc定義的節點的子節點。 Descendants()也將查看孩子和所有其他孩子節點的孩子。


更新1 - 增加了從XML

獲得特定節點獲取地址和顯示名稱的詳細信息是基本相同的過程,實際上你可以把它添加到原來的查詢,或者使用不同的查詢(這一切都取決於你想以後怎麼使用它 - 你永遠都需要的wp:listing其他元素或只是displaynameaddress

如果你可能需要別人的話,好像順理成章的事情它作爲不同的問題你可以稍後查詢你的結果。可讀性也會起作用,因爲在彼此內部嵌套多個查詢會使我難以閱讀。

獲取地址是最難的部分。你需要決定你想要它...你想要一個XElement所有的地址部分作爲子節點嗎?或者你想構建一個新的對象?或者你只需​​要一個串聯的字符串?

但一般的查詢是這樣的:

var result = from listing in listings 
      select new 
      { 
       Name = listing.Element(ns + "displayname").Value, 
       Address = listing.Element(ns + "address") 
      }; 

這將使你定義爲由Name屬性的(作爲一個字符串)匿名類型和地址屬性aIEnumerable<'a'>(如一個XElement)。如果你想要別的東西,你必須用適當的代碼行代替Address = listing.Element(ns + "address")

如果你只是需要另一個匿名類型,那麼你需要把嵌套查詢在該行:

Address = from part in listing.Elements(ns + "address") 
      select new 
      { 
       FullStreet = part.Element(ns + "fullstreet").Value, 
       HouseNumber = part.Element(ns + "house").Value, 
       Street = part.Element(ns + "street").Value, 
       StreetType = part.Element(ns + "streettype").Value, 
       // continue for all Elements you need/want 
      }; 

或者你可以創建一個Address類並調用查詢的構造函數或工廠方法並傳遞XElement或地址部分。

+0

我得到一個對象,但我不能用它做任何事情。 – Ezi

+0

你是什麼意思的一個對象?實際上列出了一個'object'類型嗎?或者它是IEnumerable <>'的一些變體? – psubsee2003

+0

它只是一個對象。 – Ezi

0

嘗試使用Descendants代替Elements

var listings = from c in xdoc.Descendants("listing") select c;