所以我正在尝试解析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”,否则没有任何内容写入控制台,之后,我会得到一个属性名称和值的列表,并且和因为我需要!
编辑:格式化。
答案 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);
}