【问题标题】:Querying xml child elements with prefixed namespace using LINQ to XML使用 LINQ to XML 查询带有前缀命名空间的 xml 子元素
【发布时间】:2012-10-03 19:47:11
【问题描述】:

所以我有一些通常看起来像这样的 XML

<wd:Data xmlns:wd="urn:com.foo.bar/GetResult">
    <wd:Result>
        <wd:field1>lorem</wd:field1>
        <wd:field2>ipsum</wd:field2>
        <wd:field3>dolor</wd:field3>
        <wd:field4>sit</wd:field4>
    </wd:Result>
</wd:Data>

命名空间以“wd”为前缀

我希望能够获取&lt;wd:Result&gt;...&lt;/wd:Result&gt; 中的每个元素并创建一个新的KeyValuePair&lt;string, string&gt;,其中键是元素名称,值是元素的值,如下所示:

{"field1", "lorem"} {"field2", "ipsum"} {"field3", "dolor"} {"field4", "坐"}

我的困难在于命名空间前缀。我是 LINQ 的新手,但我总是能够得到这样的东西来处理这样的代码:

var data = XElement.Parse(theXml); 
XNamespace ns = "urn:com.foo.bar/GetResults"; 
var result = data.Elements(ns + "Result")
                 .Select(x => new KeyValuePair<string, string>(x.Name.LocalName, x.Value))
                 .ToList();

我应该如何查询这些数据以产生所需的结果?

我没有与 LINQ 结婚,所以社区认为最好的我都会接受。

【问题讨论】:

  • 您是否意识到您的问题与命名空间无关?

标签: c# linq linq-to-xml xelement


【解决方案1】:

原来我需要将 Descendants() 与 Elements() 结合起来

以下代码完全符合我的要求:

    var data = XElement.Parse(theXml);  
    XNamespace ns = "urn:com.foo.bar/GetResults";  
    var result = data.Descendants(ns + "Result")
                     .Elements()
                     .Select(x => new KeyValuePair<string, string>(x.Name.LocalName, x.Value))
                     .ToList();

【讨论】:

  • 很高兴看到您找到解决问题的方法
  • 这为我节省了很多时间。感谢您发布您的答案
【解决方案2】:

好的,这不是一个完整的解决方案,但我认为您应该了解在 XML 中使用命名空间和使用 LINQ 读取数据的基本概念

免得说你已经在内存中加载了你的 XML,你可以在这里访问它

XDocument inventory = XDocument.Load("path_to_your_file.xml");

XNamespace vs = "urn:com.foo.bar/GetResult";
var names = doc.Descendants(vs + "Result")
           .Select(x => (string) x)
           .ToList();

这不是你的 XML 结构的精确实现,但我想你知道如何使用命名空间

【讨论】:

  • 谢谢。你的代码片段让我想到我需要在 之后调用 Elements() 我得到了 ns + "Result" 的所有后代
【解决方案3】:

您也可以使用 localname 属性并执行类似的操作

var names  = from n in xdoc.Descendants() where n.Name.LocalName == "Result" select n;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多