2010-02-12 61 views
1

我有XML是這樣的:爲什麼我無法從XPathNavigator中檢索屬性值?

<?xml version="1.0"?> 
<a xmlns="http://mynamespace"> 
    <b> 
    <c val="test" /> 
    <b> 
</a> 

,我試圖像這樣的東西,找到「VAL」屬性對「C」標記的值:

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)。

回答

3

默認名稱空間聲明不適用於屬性,因此名爲'val'的屬性不在名稱空間中,如果要訪問它,則需要在不使用名稱空間的情況下訪問它。 將屬性放入命名空間的唯一方法是給它一個帶有前綴和本地名稱(例如pf:val)的限定名稱,其中前綴綁定到名稱空間(例如xmlns:pf =「http://示例的.com/foo「的)。

2

好吧,我做了一些狩獵和發現,這是在XSD的架構元素上的以下屬性控制:

attributeFormDefault="qualified" 

attributeFormDefault="unqualified" 

默認情況下,它似乎是'不合格',也就是說屬性不屬於任何名稱空間,只有元素(由elementFormDefault值自然控制)。

默認強制使用限定屬性會強制任何XML在屬於該模式的所有屬性上要求前綴。

我的問題的答案似乎是空字符串是在接受此選項的默認值的任何架構中定義的所有屬性的正確命名空間。

第6.3節here中解釋了部分內容,其中還聲明默認名稱空間不適用於屬性 - 它們必須具有前綴,而不像元素。

相關問題