簡體   English   中英

如何使用 LINQ 按名稱在 XML 中獲取元素

[英]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);

ElementElements方法僅返回直接子項,而不是所有子項,因此它不會返回<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM