2011-03-23 103 views
0

我在查找適當的XPATH語法時遇到問題,無法使用此XML文件獲取我想要的節點。首先,XML中沒有NameSPace,所以我必須在代碼中添加一個。我認爲這會影響我的XPATH。XPATH Help:使用XPathNodeIterator在命名空間中查找XML節點

我有一個看起來像這樣的XML文件:

<configuration xmlns="http://schemas.microsoft.com/support/2003/02/config"> 
    <name>Content</name> 
    <description>Desc</description> 
    <lastModifiedBy>Me</lastModifiedBy> 
    <lastModifiedDate>2011-04-18T14:05:00</lastModifiedDate> 
    <section name="MaintenanceNotices"> 
    <key name="MaintenanceNote1" value="The Title Value" /> 
    <link id="1234" type="5" href="" target="_self" name="MaintenanceNote1a"> 
     <description>Description</description> 
    </link> 
    </section> 
</configuration> 

所以,對於XPATH,如果我想在「配置」元素,以獲得「名」節點值,我想我會用這個XPATH:

/configuration/name 

但有時我需要追加NS:它:

/ns:configuration/ns:name 

,然後我可以找到電子像這樣的lement值:

while (xmlNodeIterator.MoveNext()) { 
    result += xmlNodeIterator.Current.SelectSingleNode("name", nsmgr).ToString(); 
} 

但是這根本不適用於我。它不會在XML中找到任何值,無論我嘗試什麼xpath。這裏是我的代碼:

private string GetXML() 
    { 
     string result = string.Empty; 
     string fileName = "Content.xml"; 
     string filePath = "C:\\Content\\{0}"; 

     XPathDocument xdoc = new XPathDocument(string.Format(filePath, fileName)); 

     var nav = xdoc.CreateNavigator(); 

     XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable()); 
     nsmgr.AddNamespace("ns", "http://schemas.microsoft.com/taxonomy/2003/1"); 
     nsmgr.AddNamespace("gds", "http://support.microsoft.com/common/schemas/gdsPage/1/"); 

     string sectionName = "MaintenanceNotices"; 
     string xpath = "/configuration"; 

     // section[name={0}]"; ///key[name=MaintenanceNote1]/"; 

     XPathNodeIterator xmlNodeIterator = nav.Select(string.Format(xpath, sectionName), nsmgr); 

     while (xmlNodeIterator.MoveNext()) 
     { 
      result += xmlNodeIterator.Current.SelectSingleNode("name", nsmgr).ToString(); 
     } 

     return result; 
    } 

你能看到任何問題,或提供我的Xpath語法的建議嗎?

謝謝。

+0

的[根據需要在C#中的XPath不工作]可能重複(http://stackoverflow.com/questions/2576024/xpath-doesnt-work-as -desired-in-c) – 2011-03-23 19:36:46

回答

1

我看不出有什麼問題與您的XPath,但你永遠不會註冊了命名空間,你的文檔的節點是:

"http://schemas.microsoft.com/support/2003/02/config" 

看起來你已經知道如何做,在你的語言(使用AddNamespace),所以也許這只是一個疏忽。如果您需要了解更多信息,這應有助於:

+0

我看到,我必須在每個節點的前面添加ns:以告訴xpath我正在查找的節點位於我指定的命名空間中。我會給它一個鏡頭。謝謝。 – nocarrier 2011-03-23 19:52:13

+0

@Shawn - 除非我錯過了某些東西,否則你將'ns'綁定到'http:// schemas.microsoft.com/taxonomy/2003/1',但是你的文檔使用'http://schemas.microsoft .com/support/2003/02/config'命名空間。 – 2011-03-23 20:28:53

+0

我的命名空間錯了。這是問題所在。尊重命名空間!非常感謝。 – nocarrier 2011-03-23 20:48:24

1

正如@lwburk說,你需要註冊的名稱空間。

select語句應該是:

var xmlNodeIterator = nav.Select("/ns:configuration/ns:name", nsmgr) 
相關問題