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 结婚,所以无论社区感觉如何,我都可以接受。

4

3 回答 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();
于 2012-10-03T20:51:00.980 回答
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 结构的确切实现,但我认为您知道如何使用命名空间

于 2012-10-03T20:38:19.413 回答
0

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

var names  = from n in xdoc.Descendants() where n.Name.LocalName == "Result" select n;
于 2016-10-04T19:15:33.803 回答