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

4

因此,我有一些 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,所以只要社区认为最好的方法就可以了。


你意识到你的问题与命名空间无关了吗? - John Saunders
3个回答

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();

很高兴看到你找到了解决问题的方法。 - Rati_Ge
这节省了我很多时间。感谢您发布您的答案。 - randow_user_1234

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结构的方法,但我认为您可以理解如何使用命名空间。


谢谢。你的代码片段让我想到我需要在获取ns +“Result”的所有后代之后调用Elements()。 - syneptody

0

你也可以使用localname属性,像这样做

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接