[英]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.