C# 为什么可以';我是否从XPathNavigator中检索属性值?

C# 为什么可以';我是否从XPathNavigator中检索属性值?,c#,xml,xpath,C#,Xml,Xpath,我有这样的XML: <?xml version="1.0"?> <a xmlns="http://mynamespace"> <b> <c val="test" /> <b> </a> XmlDocument doc = new XmlDocument(); doc.Load("myxml.xml"); nsMgr = new XmlNamespaceManager(doc.NameTable); nsM

我有这样的XML:

<?xml version="1.0"?>
<a xmlns="http://mynamespace">
  <b>
    <c val="test" />
  <b>
</a>
XmlDocument doc = new XmlDocument();
doc.Load("myxml.xml");

nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace(@"mns", "http://mynamespace");

XPathNavigator root = doc.CreateNavigator();

foreach (XPathNavigator nav in root.Select("//mns:c", nsMgr))
{
    string val = nav.GetAttribute("val", NS);

    Console.WriteLine("val == "+val);
}
我的问题是GetAttribute总是以空字符串的形式返回。我错过了什么


更新:

似乎我可以通过向GetAttribute传递一个空字符串来解决这个问题,即

string val = nav.GetAttribute("val", "");

因此,我现在的问题是:为什么这会起作用?尽管XML已经根据需要“val”属性的模式进行了验证,但为什么“val”不属于我的命名空间(我在上面的示例代码中意外地省略了这一步,但我正在验证XML).

默认名称空间声明不适用于属性,因此名为“val”的属性不在名称空间中,如果要访问它,则需要在不使用名称空间的情况下访问它。
将属性放入命名空间中的唯一方法是为其提供一个带有前缀和本地名称(例如pf:val)的限定名称,其中前缀绑定到命名空间(例如xmlns:pf=)http://example.com/foo").

默认名称空间声明不适用于属性,因此名为“val”的属性不在名称空间中,如果要访问它,则需要在不使用名称空间的情况下访问它。
将属性放入命名空间中的唯一方法是为其提供一个带有前缀和本地名称(例如pf:val)的限定名称,其中前缀绑定到命名空间(例如xmlns:pf=)http://example.com/foo”。

好的,我做了一些调查,发现这在XSD中由schema元素上的以下属性控制:

attributeFormDefault="qualified"

默认情况下,它似乎是“非限定的”,也就是说属性从不属于任何名称空间,只属于元素(自然由elementFormDefault值控制)

默认情况下,强制限定属性会强制任何XML在属于该模式的所有属性上都需要前缀

我的问题的答案似乎是,对于接受此选项默认值的任何模式中定义的所有属性,空字符串都是正确的名称空间


第6.3节对此进行了部分解释,该节还指出默认名称空间不能应用于属性-它们必须有前缀,与元素不同。

好的,我进行了一些搜索,发现这在XSD中由schema元素上的以下属性控制:

attributeFormDefault="qualified"

默认情况下,它似乎是“非限定的”,也就是说属性从不属于任何名称空间,只属于元素(自然由elementFormDefault值控制)

默认情况下,强制限定属性会强制任何XML在属于该模式的所有属性上都需要前缀

我的问题的答案似乎是,对于接受此选项默认值的任何模式中定义的所有属性,空字符串都是正确的名称空间

第6.3节对此进行了部分解释,该节还指出,默认名称空间不能应用于属性-它们必须具有前缀,而不是元素