使用LINQ to XML使用带前缀的命名空间查询xml子元素

时间:2012-10-03 19:47:11

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

所以我有一些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”

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

{“field1”,“lorem”} {“field2”,“ipsum”} {“field3”,“dolor”} {“field4”,“sit”}

我的斗争是使用命名空间前缀。我非常喜欢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结婚,所以社区认为最好的对我来说没问题。

3 个答案:

答案 0 :(得分:5)

事实证明,我需要将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();

答案 1 :(得分: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结构的确切实现,但我想你了解如何使用命名空间

答案 2 :(得分:0)

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

mpirun