Не удается получить .NET XPathNavigator для работы - PullRequest
3 голосов
/ 11 января 2010

У меня проблемы с XPathNavigator. У меня есть документ с кучей «тематических» элементов без пространства имен в потоке.

Я использую (выражение ошарашено до минимума, сначала я подумал, что мои выражения неверны):

XPathDocument xmlDoc = new XPathDocument( stream );
XPathNavigator xml = xmlDoc.CreateNavigator();
XPathNodeIterator iter = xml.Select( "//topic" );

Это не работает. Я могу выбрать */*/* или что-то подобное и получить мои элементы "темы" в порядке. Я попытался запустить свои выражения в онлайн-тестере и на других языках, и они работают.

Вопрос: что не так? У меня сохраняется подозрение, что это связано с проклятым объектом NamespaceManager, который причиняет мне невероятную боль каждый раз, когда я анализирую документ с пространствами имен, но на этот раз элементы, которые я ищу, не имеют явного пространства имен! Я добавил:

XmlNamespaceManager s = new XmlNamespaceManager( xml.NameTable ); 

и передать это как 2-й аргумент в Select - безрезультатно. Как я могу добавить "" пространство имен к этой вещи / использовать его правильно?

Или, что еще лучше, есть ли способ использовать XPath в .NET без использования этой ужасной мерзости класса, как в других языках? Если мне нужны пространства имен, я могу написать их в выражении ...

Обновление: Я нашел обходной путь - скопируйте / вставьте xmlns по умолчанию из корневого узла, а затем используйте это пространство имен:

thisIsRetarded.AddNamespace( "x", "urn:xmind:xmap:xmlns:content:2.0" );
XPathNodeIterator projectIter = projectTree.Select( "//x:topic", thisIsRetarded );

однако, я не должен знать URI по умолчанию и не хочу загрязнять свои выражения ненужными x: -s. Поэтому мне нужен только ответ на 2-ю часть вопроса.

1 Ответ

4 голосов
/ 11 января 2010

Я предпочитаю использовать XmlDocument:

XmlDocument doc = new XmlDocument();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("sample", "...");
doc.Load(stream);

XmlNode topic = doc.SelectSingleNode("/sample:topic", nsmgr);

// If you don't have any namespaces....
XmlNode topic2 = doc.SelectSingleNode("/topic"); 
...