当前位置:  开发笔记 > 编程语言 > 正文

SelectSingleNode使用XPath为已知良好的xml节点路径返回null

如何解决《SelectSingleNode使用XPath为已知良好的xml节点路径返回null》经验,为你挑选了4个好方法。

考虑这个简单的XML文档.这里显示的序列化XML是来自复杂POCO对象的XmlSerializer的结果,该对象的模式我无法控制.


   
        

目标是在id节点上提取扩展属性的值.在这种情况下,我们使用SelectSingleNode方法,并给出一个XPath表达式:

XmlNode idNode = myXmlDoc.SelectSingleNode("/My_RootNode/id");
//idNode is evaluated to null at this point in the debugger!
string msgID = idNode.Attributes.GetNamedItem("extension").Value;

问题是该SelectSingleNode方法为给定的XPath表达式返回null.

问题:关于此XPath查询的正确性的任何想法,或者为什么此方法调用+ XPath表达式将返回空值?也许命名空间是问题的一部分?



1> Jon Skeet..:

我强烈怀疑问题与名称空间有关.尝试摆脱命名空间,你会没事的 - 但显然这对你的实际案例没有帮助,我认为这个文件是固定的.

我不记得如何在XPath表达式中指定命名空间,但我确信这是问题所在.

编辑:好的,我记得现在该怎么做.虽然它不是非常令人愉快 - 你需要XmlNamespaceManager为它创造一个.以下是一些适用于示例文档的示例代码:

using System;
using System.Xml;

public class Test
{
    static void Main()
    {
        XmlDocument doc = new XmlDocument();
        XmlNamespaceManager namespaces = new XmlNamespaceManager(doc.NameTable);
        namespaces.AddNamespace("ns", "urn:hl7-org:v3");
        doc.Load("test.xml");
        XmlNode idNode = doc.SelectSingleNode("/My_RootNode/ns:id", namespaces);
        string msgID = idNode.Attributes["extension"].Value;
        Console.WriteLine(msgID);
    }
}



2> mrzli..:

如果要完全忽略名称空间,可以使用:

static void Main(string[] args)
{
    string xml =
        "\n" +
        "    \n" +
        "    \n" +
        "";

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);

    XmlNode idNode = doc.SelectSingleNode("/*[local-name()='My_RootNode']/*[local-name()='id']");
}



3> 小智..:

这应该适用于你的情况而不删除命名空间:

XmlNode idNode = myXmlDoc.GetElementsByTagName("id")[0];



4> John Saunder..:

对不起,您忘记了命名空间.你需要:

XmlNamespaceManager ns = new XmlNamespaceManager(myXmlDoc.NameTable);
ns.AddNamespace("hl7","urn:hl7-org:v3");
XmlNode idNode = myXmlDoc.SelectSingleNode("/My_RootNode/hl7:id", ns);

实际上,无论是在此处还是在Web服务中,从XPath操作或依赖于XPath的任何操作返回null通常都表明XML命名空间存在问题.


我相信John几乎是完全正确的,因为"id"元素的全名是"urn:h17-org:v3"和"id".您正在使用XPATH搜索""和"id",因此找不到任何内容.但是,要实际工作,您需要将ns实例作为SelectSingleNode的第二个参数传递.
推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有