【问题标题】:How to parse XML with namespace如何使用命名空间解析 XML
【发布时间】:2013-08-14 11:33:12
【问题描述】:

你好,

我有一个 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();

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

【问题讨论】:

  • this 有效吗? XNamespace ns = "XXXXX"; 然后p.Descendants(ns + "name").First().Value

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


【解决方案1】:

你可以这样做

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

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

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

【讨论】:

  • XNamespace.Get() 似乎不是最好的方法。
  • 通常使用命名空间我已经使用了上述方法,但在这种情况下它可能并不总是有效的。另一种方法是什么?
  • 如果你真的很在意效率,你可以用XmlReader解析xml。
  • @ChristopherStevenson - 不太关心性能方面的效率,但XNameSpace.Get 不是最好的方法。
【解决方案2】:

对于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");

【讨论】:

    【解决方案3】:

    要在XLinQ 查询中删除namespaces,请使用下面提到的类似方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-03
      • 2014-01-10
      • 2010-11-08
      • 2018-07-15
      • 2012-06-11
      • 2015-09-08
      相关资源
      最近更新 更多