如何解析带有命名空间的XML
本文关键字:XML 命名空间 何解析 | 更新日期: 2023-09-27 18:27:49
你好,
我有一个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();
有没有一种简单的方法可以实现这一点?
您可以执行此
XNamespace ns = XNamespace.Get("XXXX");
var listOfNames = doc.Descendants(ns + "feed")
.Select(x => x.Elements().First().Value).ToList();
+拉兹别列佐夫斯基的回答是1。如果需要指定元素名称(在本例中为name
),或者可能有多个名称元素,则需要为这些元素添加第二个名称空间。
XNamespace ns2 = XNamespace.Get("XXXXX");
var listOfNames = doc.Root.Descendants(ns2 + "name").Select(x => x.Value).ToList();
使用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");
要在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);
}