C # SelectSingleNode с проблемами NameSpace - PullRequest
2 голосов
/ 28 марта 2011

Я использую C # (.NET 2.0) - фактически пытаюсь заставить его работать на Mac OS X с использованием MONO (я не думаю, что MONO - это проблема)

Учитывая следующий фрагмент XML, который имеетбыл получен как XmlNode из большего XmlDocument:

<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, но я просто не могу.Это мой код:

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.

Кто-нибудь из них был бы достаточно любезен, если бы указывал, где проблема?

Ответы [ 2 ]

1 голос
/ 02 апреля 2011

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 и префиксы в коде не должны совпадать, если совпадают связанные пространства имен.

0 голосов
/ 01 апреля 2011

Попробуйте получить subcategoryName напрямую:

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

Это позволит получить все элементы subcategoryName в файле xml.

...