如何解析带命名空间的XML

4

你好,

我有一个xml文档:

<ns2:feeds xmlns:ns2="XXXX" xmlns="XXXXX" version="3.0">
    <ns2:feed>
        <name>XXX</name>
    </ns2:feed>
    <ns2:feed>
        <name>XXX</name>
    </ns2:feed>
    <ns2:feed>
        <name>XXX</name>
    </ns2:feed>
</ns2:feeds>

我应该如何使用 LinqToXml 获取 Name 属性列表?无论我尝试什么都不起作用...

var doc = XDocument.Load(@"feed.xml");

var names = doc
.XPathSelectElements("/*/*[localname()='feeds']") //What should the Xpath be, here?
.Select(p => new 
{ 
    Name = p.Descendants("name").First().Value
})
.ToList();

有没有简单的方法来实现这个?

2
这个代码是否有效?XNamespace ns =“XXXXX”;然后是p.Descendants(ns +“name”)。First()。Value - Corak
3个回答

8

你可以做到这一点

XNamespace ns = XNamespace.Get("XXXX");
var listOfNames = doc.Descendants(ns + "feed")
                     .Select(x => x.Elements().First().Value).ToList();

支持lazyberezovsky的回答。如果您需要指定元素名称(在这种情况下为name)或者您可能有多个名称元素,则需要为这些元素添加第二个命名空间。

XNamespace ns2 = XNamespace.Get("XXXXX");
var listOfNames = doc.Root.Descendants(ns2 + "name").Select(x => x.Value).ToList();

这里似乎不是使用XNamespace.Get()的最佳方法。 - H H
通常我使用上述方法来处理命名空间,但在某些情况下可能并不高效。有什么替代方法吗? - keyboardP
如果您真的关心效率,您可以使用XmlReader解析xml。 - Christopher Stevenson
@ChristopherStevenson - 我们不太关心性能效率,但是我们希望XNameSpace.Get的方法不是最佳途径。 - keyboardP

6
使用XPathSelectElements时,您需要提供命名空间管理器以在XPath查询中使用命名空间:
var manager = new XmlNamespaceManager(new NameTable());
manager.AddNamespace("ns2", "XXXX");
manager.AddNamespace("ns", "XXXXX"); // default namespace

var names = from n in xdoc.XPathSelectElements("//ns2:feed/ns:name", manager)
            select (string)n;

如果没有XPath,你应该使用XNamespace来提供要查找的节点名称:

XNamespace ns = "XXXXX";
XNamespace ns2 = "XXXX";

var names = from f in xdoc.Descendants(ns2 + "feed")
            select (string)f.Element(ns + "name");

4

要在XLinQ查询中去除命名空间,请使用下面提到的类似方法:

String xml_string = @"<ns2:feeds xmlns:ns2=""XXXX"" xmlns=""XXXXX"" version=""3.0"">
                          <ns2:feed>
                              <name>XXX</name>
                          </ns2:feed>
                          <ns2:feed>
                              <name>YYY</name>
                          </ns2:feed>
                          <ns2:feed>
                              <name>ZZZ</name>
                          </ns2:feed>
                      </ns2:feeds>";

var query = XElement.Parse(xml_string).Descendants()
           .Where(c => c.Name.LocalName.ToString() == "name")
           .ToArray();

foreach (String item in query)
{
    Console.WriteLine(item);
}

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