我正在使用C#(.NET 2.0) - 实际上尝试使用MONO在Mac OS X上运行(我不认为MONO是问题)
鉴于以下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 :(得分: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>";
}
注意:您无需在de xml文档中添加前缀。只要关联的命名空间匹配,xml文档中的前缀和代码中的前缀就不必匹配。
答案 1 :(得分:0)
尝试直接获取subcategoryName
:
XmlNodeList subcatList = xmldoc.GetElementsByTagName( "subcategoryName" );
foreach( XmlNode subcat in subcatList )
{
Console.WriteLine( subcat.InnerText );
}
这将获取xml文件中的所有subcategoryName
元素。