繁体   English   中英

C#SelectSingleNode与名称空间问题

[英]C# SelectSingleNode with NameSpace issues

我正在使用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声明,但是没有运气。

外面有人可以提供问题的根源吗?

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文档中的前缀与代码中的前缀不必匹配,只要关联的名称空间匹配即可。

尝试直接获取subcategoryName

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

这将获取xml文件中的所有subcategoryName元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM