SelectSingleNode возвращает ноль - даже с пространством имен - PullRequest
3 голосов
/ 30 марта 2011

Я знаю, что этот вопрос уже задавался подобным образом, но я не могу заставить его работать.

У меня есть xml:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
    <Research xmlns="http://www.rixml.org/2005/3/RIXML" xmlns:xalan="http://xml.apache.org/xalan" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" createDateTime="2011-03-29T15:41:48Z" language="eng" researchID="MusiJvs3008">
    <Product productID="MusiJvs3008">
    <StatusInfo currentStatusIndicator="Yes" statusDateTime="2011-03-29T15:41:48Z" statusType="Published" />
    <Source>
    <Organization type="SellSideFirm" primaryIndicator="Yes">
    <OrganizationID idType="Reuters">9999</OrganizationID> 

И я 'Я пытаюсь прочитать значения, используя xpath:

XPathDocument xmldoc = new XPathDocument(xmlFile); 
XPathNavigator nav = xmldoc.CreateNavigator(); 
XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable);
nsMgr.AddNamespace(string.Empty, "http://www.rixml.org/2005/3/RIXML"); 
XPathNavigator result = nav.SelectSingleNode("/Research", nsMgr); // <-- Returns null!

Но даже простой выбор корневого узла возвращает ноль!Я уверен, что у меня что-то не так с моим пространством имен.Может кто-нибудь помочь, пожалуйста?

В идеале я хочу простые строки, которые позволят мне выбирать значения из файла XML, например

String a = xmlDoc.SelectSingleNode(@"/Research/Product/Content/Title").Value;

Кстати, я не имею (прямого) контроля над файлом XMLсодержание.

Ответы [ 3 ]

5 голосов
/ 30 марта 2011

Я не верю, что вы можете использовать псевдоним пустого пространства имен и использовать его автоматически в выражении XPath. Как только вы используете реальный псевдоним, он должен работать. Этот тест в порядке, например:

using System;
using System.Xml;
using System.Xml.XPath;

class Test
{
    static void Main() 
    {
        string xmlFile = "test.xml";
        XPathDocument xmldoc = new XPathDocument(xmlFile); 
        XPathNavigator nav = xmldoc.CreateNavigator(); 
        XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable);
        nsMgr.AddNamespace("x", "http://www.rixml.org/2005/3/RIXML"); 
        XPathNavigator result = nav.SelectSingleNode("/x:Research", nsMgr);
        Console.WriteLine(result);
    }
}

Кстати, у вас есть для использования XPath и XPathDocument? Я склонен находить, что LINQ to XML является намного более приятным API, особенно когда речь идет о пространствах имен. Если вы используете .NET 3.5 и у вас нет особых требований к использованию XPath, я бы посоветовал вам проверить его.

3 голосов
/ 30 марта 2011

Внести следующие изменения

nsMgr.AddNamespace("x", "http://www.rixml.org/2005/3/RIXML"); 
XPathNavigator result = nav.SelectSingleNode("/x:Research", nsMgr);
0 голосов
/ 29 мая 2012

я мог бы опубликовать и ответить на свой вопрос, для нативного эквивалента этого кода. Вместо этого я просто добавлю это как ответ до конца.

При использовании собственного объекта IXMLDOMDocument (версия 6):

//Give the default namespace as alias of "x"
document.setProperty("SelectionNamespaces","xmlns:x='http://www.rixml.org/2005/3/RIXML'");

//Query for the nodes we want
document.selectSingleNode("/x:Research");

Дополнительный вопрос: Почему, о, почему, объектная модель Xml-документа не запрашивает пространство имен по умолчанию , если пространство имен не указано ... sigh

...