У меня есть приложение, которое должно загружать XML-документ и выходные узлы в зависимости от XPath.
Предположим, я начинаю с такого документа:
<aaa>
...[many nodes here]...
<bbb>text</bbb>
...[many nodes here]...
<bbb>text</bbb>
...[many nodes here]...
</aaa>
С XPath //bbb
Пока все хорошо.
И выбор doc.SelectNodes("//bbb");
возвращает список необходимых узлов.
Затем кто-то загружает документ с одним узлом, таким как <myfancynamespace:foo/>
, и дополнительным пространством имен в корневом теге, и все ломается.
Почему? //bbb
не наплевать на myfancynamespace
, теоретически это должно быть даже хорошо с //myfancynamespace:foo
, так как нет никакой двусмысленности, но выражение возвращает 0 результатов, и все.
Есть ли способ обойти это поведение?
У меня есть менеджер пространства имен для документа, и я передаю его в запрос Xpath. Но пространства имен и префиксы мне неизвестны, поэтому я не могу добавить их до запроса.
Должен ли я предварительно проанализировать документ, чтобы заполнить диспетчер пространства имен, прежде чем делать какие-либо выборы? Почему такое поведение, это просто не имеет смысла.
EDIT:
Я использую:
XmlDocument
и XmlNamespaceManager
EDIT2:
XmlDocument doc = new XmlDocument();
doc.XmlResolver = null;
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
//I wish I could:
//nsmgr.AddNamespace("magic", "http://magicnamespaceuri/
//...
doc.LoadXML(usersuppliedxml);
XmlNodeList nodes = doc.SelectNodes(usersuppliedxpath, nsmgr);//usersuppliedxpath -> "//bbb"
//nodes.Count should be > 0, but with namespaced document they are 0
EDIT3:
Нашел статью, которая описывает реальный сценарий проблемы с одним обходным путем, но не очень симпатичным обходным путем: http://codeclimber.net.nz/archive/2008/01/09/How-to-query-a-XPath-doc-that-has-a-default.aspx
Почти кажется, что удаление xmlns - это путь ...