[英]How to get elements by name in XML using LINQ
我在這里選擇標題是因為我的問題是我需要獲取示例中提到的 Item 節點。 我有以下 XML 並且在使用 LINQ 查詢它時遇到問題,我之前已經能夠解析 XML - 但是我已經堅持了幾個小時,希望有人能提供幫助。 下面是我的 XML 數據(示例數據):
<a:entry
xmlns:a="http://www.w3.org/2005/Atom">
<a:id>98765</a:id>
<info>Data Catalogue</info>
<data>
<items>
<item>
<id>123456</id>
<value>Item One</value>
</item>
<item>
<id>654321</id>
<value>Item Two</value>
</item>
</items>
</data>
<items>
<item>
<id>123456</id>
<value>Item One</value>
</item>
<item>
<id>654321</id>
<value>Item Two</value>
</item>
</items>
<a:author>
<a:name>Catalogue</a:name>
</a:author>
</a:entry>
我希望能夠從 Items 下的 Item XML 標簽中提取 ID,但是在數據下有一個帶有 Item 條目的 Items 標簽我根本不想要這些節點 - 我想要 root/items/id/id 如果這被表達了作為路徑。 我已經嘗試了我對 LINQ 的所有了解,所以如果有人可以提供幫助,請注意盡管這是基於系統的示例數據 - 格式無法更改,因此這不是一個可接受的解決方案。
我似乎無法確定我哪里出錯了 - 我嘗試的每個 LINQ 表達式都沒有返回任何內容,我認為命名空間是一個問題,並試圖整合它,但我正在兜圈子。
解決方案必須適用於 Silverlight 和 C#
我嘗試了以下方法:
IEnumerable<XElement> nodes =
element.Elements().Where(e => e.Name.LocalName == "items")
但是,這讓我獲得了所有“項目”,包括我不想要的“數據”下的項目。
如果我對 XML 執行以下操作,我確實會看到顯示的元素名稱:
XElement element = XElement.Parse(data);
foreach (XElement node in element.Elements())
{
MessageBox.Show(node.Name.LocalName);
}
但是,當我這樣做時,我根本看不到項目下的節點名稱 - 我檢查了 XElement,它確實有節點,當我輸出上面的名稱時,“項目”與信息和 ID 一起顯示!
foreach (XElement node in element.Elements("items"))
{
MessageBox.Show(node.Name.LocalName);
}
假設element
是您的<a:entry>
元素:
var ids = element.Element("items")
.Elements("item")
.Select(item => item.Element("id").Value);
Element
和Elements
方法僅返回直接子項,而不是所有子項,因此它不會返回<data>
下的<items>
元素
我的 XML 中有一個空白的命名空間聲明,一旦我將它添加到我的代碼中,我就沒有注意到它起作用了 - 忘記了 LINQ 是非常面向命名空間的!
XNamespace ns = "http://example.org/namespace";
var ids = element.Element(ns + "items")
.Elements("item")
.Select(item => item.Element("id").Value);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.