[英]Why can't I retrieve attribute values from my XPathNavigator?
我有这样的XML:
<?xml version="1.0"?>
<a xmlns="http://mynamespace">
<b>
<c val="test" />
<b>
</a>
我正在尝试使用类似以下的方法在'c'标签上找到'val'属性的值:
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", "");
因此,我现在的问题是:为什么这样做有效? 尽管已根据需要“ val”属性的架构对XML进行了验证,但为什么“ val”不属于我的命名空间(我在上面的示例代码中无意中省略了此步骤,但我正在验证XML)。
默认名称空间声明不适用于属性,因此名为“ val”的属性不在任何名称空间中,如果要访问它,则需要不使用名称空间来访问它。 将属性放在名称空间中的唯一方法是给它一个限定名称,该名称带有前缀和本地名称(例如pf:val),其中前缀绑定到名称空间(例如xmlns:pf =“ http:// example”)。 com / foo”)。
好的,我进行了一些搜索,发现这在XSD中由schema元素上的以下属性控制:
attributeFormDefault="qualified"
要么
attributeFormDefault="unqualified"
默认情况下,它似乎是“不合格的”,也就是说,属性从不属于任何名称空间,而仅属于元素(自然由elementFormDefault值控制)。
默认情况下,强制使用合格属性会强制所有XML在属于该模式的所有属性上都要求前缀。
我的问题的答案似乎是,空字符串是在接受此选项默认值的任何模式中定义的所有属性的正确名称空间。
这部分在第6.3节,说明这里也指出默认命名不能应用于属性-它们必须有前缀,不同的元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.