我發現了很多關於這個主題的例子和問題,但是我試過的結果是空白的。使用LINQ解析XML流
從xml中我需要從那裏得到第一個'listing'元素,我只需要顯示名稱和地址信息。
var listings = from c in xdoc.Elements("listing") select c;
我發現了很多關於這個主題的例子和問題,但是我試過的結果是空白的。使用LINQ解析XML流
從xml中我需要從那裏得到第一個'listing'元素,我只需要顯示名稱和地址信息。
var listings = from c in xdoc.Elements("listing") select c;
你缺少你查詢的命名空間。節點的名稱是不是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
其他元素或只是displayname
和address
如果你可能需要別人的話,好像順理成章的事情它作爲不同的問題你可以稍後查詢你的結果。可讀性也會起作用,因爲在彼此內部嵌套多個查詢會使我難以閱讀。
獲取地址是最難的部分。你需要決定你想要它...你想要一個XElement
所有的地址部分作爲子節點嗎?或者你想構建一個新的對象?或者你只需要一個串聯的字符串?
但一般的查詢是這樣的:
var result = from listing in listings
select new
{
Name = listing.Element(ns + "displayname").Value,
Address = listing.Element(ns + "address")
};
這將使你定義爲由Name屬性的(作爲一個字符串)匿名類型和地址屬性a
的IEnumerable<'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或地址部分。
嘗試使用Descendants
代替Elements
var listings = from c in xdoc.Descendants("listing") select c;
我得到一個對象,但我不能用它做任何事情。 – Ezi
你是什麼意思的一個對象?實際上列出了一個'object'類型嗎?或者它是IEnumerable <>'的一些變體? – psubsee2003
它只是一個對象。 – Ezi