SelectSingleNode返回null - 即使是命名空间

时间:2011-03-30 16:09:56

标签: c# .net xml namespaces searching-xml

我知道这个问题之前已经以类似的方式提出过,但我似乎无法让这个问题起作用。

我有一些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!

但即使是简单的根节点选择也会返回null!我确信我的命名空间有问题。有人可以帮忙吗?

理想情况下,我想要简单的行,让我从xml文件中选择值,即

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

顺便说一下,我没有(直接)控制XML文件内容。

3 个答案:

答案 0 :(得分:5)

我不相信你可以使用一个空的命名空间别名,并让它由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,我建议您查看它。

答案 1 :(得分:3)

进行以下更改

nsMgr.AddNamespace("x", "http://www.rixml.org/2005/3/RIXML"); 
XPathNavigator result = nav.SelectSingleNode("/x:Research", nsMgr);

答案 2 :(得分:0)

我可以发布并回答我自己的问题,因为 native 相当于此代码。相反,我只是将它作为答案添加到最后。

使用本机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 Document对象模型查询默认名称空间... 叹息