2011-03-28 47 views
2

我使用C#(.NET 2.0) - 實際上是試圖讓它在Mac OS X上使用工作MONO(我不認爲MONO是問題)命名空間C#的SelectSingleNode發出

考慮下面的XML已被取出作爲從一個更大的XmlDocument一個XmlNode的片段:

<subcategoryCode xmlns="uuid:7E1158D2-DA42-4048-8513-66B4D48FA992">N100</subcategoryCode> 
<subcategoryName xmlns="uuid:7E1158D2-DA42-4048-8513-66B4D48FA992">DJ Headphones</subcategoryName> 
<products xlink:href="tcm:5-33975" xlink:title="TESTONE Composition" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="uuid:7E1158D2-DA42-4048-8513-66B4D48FA992" /> 
<products xlink:href="tcm:5-54295" xlink:title="HPX2000 Composition" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="uuid:7E1158D2-DA42-4048-8513-66B4D48FA992" /> 
<products xlink:href="tcm:5-54296" xlink:title="HPX4000 Composition" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="uuid:7E1158D2-DA42-4048-8513-66B4D48FA992" /> 

我試圖檢索使用的SelectSingleNode subcategoryName但我根本做不到。這是我的代碼:

XmlNamespaceManager nsm = new XmlNamespaceManager(doc.NameTable); 
nsm.AddNamespace(String.Empty, "uuid:7E1158D2-DA42-4048-8513-66B4D48FA992"); 

XmlNodeList subcatList = doc.GetElementsByTagName("subcategories"); 

foreach (XmlNode subcat in subcatList) { 
    html += "<div id=\""; 
    html += subcat.SelectSingleNode("subcategoryName", nsm).InnerText; // <-- HERE IS MY PROBLEM!!! 
    html += "\" class=\"product_thumbs_holder\" style=\"display: block; \">"; 
    html += "</div>"; 
    html += "<div style=\"clear:both\"></div>"; 
} 

我認爲問題可能與我處理命名空間,但我一直停留在這幾個小時的路。我嘗試了一堆類似的AddNamespace聲明,但沒有運氣。

任何人都會有足夠的善意提供任何問題的指針?

+0

你在哪裏添加命名空間管理器到XMLDocument? – 2011-03-28 09:39:06

+0

@Furqan我不知道...變量「doc」是一個XmlDocument對象,我作爲函數中的參數接收,然後執行此操作: 'private static string generateTridionRightPaneCode(XmlDocument doc){ XmlNamespaceManager nsm =新的XmlNamespaceManager(doc.NameTable); nsm.AddNamespace(「uuid」,「uuid:7E1158D2-DA42-4048-8513-66B4D48FA992」);' 那夠了嗎? 謝謝 – 2011-03-28 09:48:09

+0

片段中的子類別元素在哪裏。你正在使用這個檢索它們:XmlNodeList subcatList = doc.GetElementsByTagName(「subcategories」); 但沒有任何這樣的元素,你的節點列表應該是空的 – 2011-03-28 12:29:57

回答

0

嘗試獲得了subcategoryName直接:

XmlNodeList subcatList = xmldoc.GetElementsByTagName("subcategoryName"); 
foreach(XmlNode subcat in subcatList) 
{ 
    Console.WriteLine(subcat.InnerText); 
} 

這將讓所有的XML文件subcategoryName元素。

1

XPath不適用於默認名稱空間。您必須爲名稱空間創建一個前綴。此代碼應工作:

XmlNamespaceManager nsm = new XmlNamespaceManager(doc.NameTable); 
nsm.AddNamespace("x", "uuid:7E1158D2-DA42-4048-8513-66B4D48FA992"); 

XmlNodeList subcatList = doc.GetElementsByTagName("subcategories"); 

foreach (XmlNode subcat in subcatList) { 
    html += "<div id=\""; 
    html += subcat.SelectSingleNode("x:subcategoryName", nsm).InnerText; // <-- HERE IS MY PROBLEM!!! 
    html += "\" class=\"product_thumbs_holder\" style=\"display: block; \">"; 
    html += "</div>"; 
    html += "<div style=\"clear:both\"></div>"; 
} 

注:你不需要添加前綴德XML文件內。只要相關的命名空間匹配,xml文檔中的前綴和代碼中的前綴就不必匹配。

+0

+1代碼確實起作用,並且早就應該得到綠票!好的音符也是。 – davmos 2013-09-12 09:53:57