在使用xmlns解析xml文件时,为什么XElement会崩溃?

时间:2010-03-11 14:27:18

标签: c# parsing linq-to-xml xml-namespaces xelement

所以我正在尝试解析xml文件:

 <?xml version="1.0" encoding="utf-8" ?>
<Root>    
  <att1 name="bob" age="unspecified" xmlns="http://foo.co.uk/nan">    
  </att1>    
</Root>

使用以下代码:

XElement xDoc= XElement.Load(filename);
var query = from c in xDoc.Descendants("att1").Attributes() select c;
foreach (XAttribute a in query)
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}

除非我从xml文件中删除xmlns =“http://foo.co.uk/nan”,否则没有任何内容写入控制台,之后,我会得到一个属性名称和值的列表,并且和因为我需要!

编辑:格式化。

3 个答案:

答案 0 :(得分:3)

您必须在代码中使用相同的命名空间:

XElement xDoc= XElement.Load(filename);
XNamespace ns = "http://foo.co.uk/nan";
var query = from c in xDoc.Descendants(ns + "att1").Attributes() select c;
foreach (XAttribute a in query)
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}

属性不会选择默认(xmlns=....)命名空间,因此您无需限定它们。命名空间标记(xmln:tags=....)纯粹是文档或API使用的本地标记,名称实际上是命名空间+本地名称,因此您必须始终指定命名空间。

答案 1 :(得分:2)

您对Descendants的调用是在没有名称空间的情况下查询名为“att1”的元素。

如果你调用了Descendants("{http://foo.co.uk/nan}att1"),你将选择命名空间元素,而不是非命名空间元素。

您可以在任何名称空间中选择名为“att1”的元素,如下所示:

var query = from c in xDoc.Descendants() where c.Name.LocalName == "att1" select c.Attributes;

答案 2 :(得分:1)

您需要在Descendants调用中指定命名空间,如下所示:

XNamespace ns = "http://foo.co.uk/nan";
foreach (XAttribute a in xDoc.Descendants(ns + "att1"))
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}