XPath Query, похоже, не работает - PullRequest
0 голосов
/ 21 октября 2011

У меня возникли некоторые проблемы при выполнении запроса xpath в C # с предупреждением о том, что я никогда раньше не использовал пространства имен, но я обычно понимаю эту идею.Сначала я создаю XML-документ как таковой и создаю менеджер пространства имен.

XmlDocument doc = new XmlDocument();
doc.Load(metaDataStream);
nsmgr = new XmlNamespaceManager(doc.NameTable);
rootNode = doc.ChildNodes[1];
nsmgr.AddNamespace(string.Empty, rootNode.Attributes["xmlns"].Value);
nsmgr.AddNamespace("xsi", rootNode.Attributes["xmlns:xsi"].Value);
nsmgr.AddNamespace("xsd", rootNode.Attributes["xmlns:xsd"].Value);

Затем, позже, в другом методе класса, я пытаюсь запросить XML-код как таковой.*

и список выбранных узлов всегда отображается с нулевыми узлами, выбранными из текста XML ниже.Может кто-нибудь направить меня туда, где я ошибся?(как примечание, настоящий XML-код не совсем такой, но по соображениям конфиденциальности мне не разрешено его обнародовать, поэтому я старался изо всех сил скрывать данные, сохраняя те же свойства)

1 Ответ

3 голосов
/ 21 октября 2011

Мне кажется, проблема в том, что вы используете string.Empty в качестве псевдонима для пространства имен. Это работает:

nsmgr.AddNamespace("def", rootNode.Attributes["xmlns"].Value);
...            
XmlNodeList selectedNodes = rootNode.SelectNodes("//def:somenode", nsmgr);

В основном, если вы делаете присваиваете ему псевдоним, он отлично работает.

(Лично я предпочитаю LINQ to XML вместо использования XPath, если вы используете .NET 3.5 или выше, но это будет работать, если вы предпочитаете использовать XPath.)

EDIT : поведение указано в MSDN: http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.addnamespace.aspx в качестве примечания к аргументу "префикс": «Если XmlNamespaceManager будет использоваться для разрешения пространств имен в выражении XML Path Language (XPath), необходимо указать префикс . Если выражение XPath не включает префикс, это предполагается, что универсальный идентификатор ресурса (URI) пространства имен является пустым пространством имен. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...