У меня проблемы с 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-ю часть вопроса.