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

回答(9)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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

编辑:好的,我've remembered how to do it now. It'虽然不是很令人愉快 - 你需要为它创建一个 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);

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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']");

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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命名空间存在问题 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

嗯......我遇到了同样的问题而且很头疼 . 由于我不太关心命名空间或xml架构,我只是从我的xml中删除了这些数据,它解决了我所有的问题 . 可能不是最好的答案?可能,但如果您不想处理所有这些并且您只关心数据(并且不会将xml用于其他任务),删除命名空间可能会解决您的问题 .

XmlDocument vinDoc = new XmlDocument();

string vinInfo = "your xml string";

vinDoc.LoadXml(vinInfo);

vinDoc.InnerXml = vinDoc.InnerXml.Replace("xmlns=\"http://tempuri.org\/\", "");

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

只是为了解决命名空间问题,在我的情况下,我一直在运行具有多个命名空间的文档,并且需要正确处理命名空间 . 我编写了下面的函数来获取命名空间管理器来处理文档中的任何命名空间:

private XmlNamespaceManager GetNameSpaceManager(XmlDocument xDoc)

{

XmlNamespaceManager nsm = new XmlNamespaceManager(xDoc.NameTable);

XPathNavigator RootNode = xDoc.CreateNavigator();

RootNode.MoveToFollowing(XPathNodeType.Element);

IDictionary NameSpaces = RootNode.GetNamespacesInScope(XmlNamespaceScope.All);

foreach (KeyValuePair kvp in NameSpaces)

{

nsm.AddNamespace(kvp.Key, kvp.Value);

}

return nsm;

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

只需使用// id而不是/ id . 它在我的代码中工作正常

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

要记住的规则是:如果您的文档指定 namespace ,则必须在调用 SelectNodes() 或 SelectSingleNode() 时使用 XmlNamespaceManager . 这是好事 .

请参阅文章Advantages of namespaces . Jon Skeet在他的答案中做得很好,展示了如何使用 XmlNamespaceManager . (这个答案应该只是对答案的评论,但我没有足够的Rep Points来评论 . )

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

Roisgoen的回答对我有用,但为了使它更通用,你可以使用RegEx:

//Substitute "My_RootNode" for whatever your root node is

string strRegex = @"\s+xmlns([\s]|[^>])*)>";

var myMatch = new Regex(strRegex, RegexOptions.None).Match(myXmlDoc.InnerXml);

if (myMatch.Success)

{

var grp = myMatch.Groups["xmlns"];

if (grp.Success)

{

myXmlDoc.InnerXml = myXmlDoc.InnerXml.Replace(grp.Value, "");

}

}

我完全承认这不是一个最佳实践答案,但它是一个简单的解决方案,有时这就是我们所需要的 .

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdfs 多租户_【技术干货】常见的HDFS面试问答精选

最常见的HDFS面试问答1. 什么是HDFS?答:HDFS代表Hadoop分布式文件系统,该系统将大型数据集存储在Hadoop中。它可以在商用硬件上运行,并且具有很高的容错能力。HDFS遵循主/从体系结构,其中许多计算机在集群上运行。群集…

python 根据类名 查找module_关于 Python 命令中的 m 参数

在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下:python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]本文想要聊聊比较特殊的“-m”选项:关于它的典型用法、原理解析与发…

matlab安装程序无法启动jvm_JVM 执行 Java 程序时的内存区域划分

在学习 Java 虚拟机(后面简称: JVM )中的垃圾回收机制(GC)之前,先需要了解 在 JVM 中的 Java 程序(class 文件)加载到内存之后到底是怎么存的。在阅读了 JVM规范 和周志明的 《深入理解Java虚拟机(第2版)》 之后,总结一下JVM中的内存划分以及…

map循环遍历取值_Collection集合框架集和map

Collection集合框架集Java培训之Collection集合框架集MapMap概述Map与Collection并列存在。用于保存具有映射关系的数据:Key-ValueMap 中的 key 和 value 都可以是任何引用类型的数据Map 中的 key 不允许重复key 和 value 之间存在单向一对一关系,即通过指定的 key …

rserve php,使用Rserve远程执行R脚本

Rserve介绍Rserve是一个基于TCP/IP协议的,允许R语言与其他语言通信的C/S结构的程序,支持C/C,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供远程连接,认证,文件传输等功能。我们可以设计R做为后台服务,处理统计建模&…

搜索引擎提交软件_搜索引擎优化的发展史及SEO前景展望

SEO 是随着搜索引擎的普及而出现,并伴随搜索引擎的发展而发展的。关于搜索引擎和搜索引擎优化SEO 最初是怎么诞生的有很多种说法。有一个非常有趣的事实是,最早的一批SEO 甚至可以追溯到Yahoo 出现之前,我们可以把Yahoo 的传世人David Filo 和…

mongodb模糊查询_MongoDB的CRUD基本操作

原创:牛津小马哥Python后端工程师小李哥。在上周的推文中,我们介绍了MongoDB的数据库和集合的操作,现在,让我们来继续学习mongodb的另一个操作:CRUDCRUD操作:创建、读取、更新、删除文档。创建操作&#xf…

设计一个程序实现两个任意长的整数的求和运算_自然数集,整数集,有理数集等都有字母表示,为什么无理数集没有...

在网上翻到一个非常有意思的问题:这个问题乍看起来无厘头,但实际上是个非常深刻的问题,涉及到抽象代数(abstract algebra)的一些基本概念,因此我打算写篇文章来详细阐述一下。人类的数学从数数开始,最早诞生的概念是自…

php strpo函数,php strpos函数有什么用

php strpos函数有什么用?定义和用法strpos() f函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。注释:strpos() 函数是区分大小写的。注释:该函数是二进制安全的。相关函数:strrpos() - 查找字符串在另一字符串中最后一…

oracle 客户端_【数据库 常见术语1】 客户端,服务端

这个系列会介绍并回顾在学习和工作中常碰到的一些名词,以及它们的意思。客户端,服务端(以Oracle数据库为例)**************************************************************************************【我的理解】 打个比喻&…

多个线程访问统一对象的不同方法_分析| 你未必真的了解线程安全,别骗自己,来看下怎么实现线程安全...

世界那么大,谢谢你来看我!!关注我你就是个网络、电脑、手机小达人什么是进程?电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。比如下图中的QQ、酷狗播放器、电脑管…

php设置mysql查询编码,php连接mysql时怎么设置编码方式

php连接mysql时怎么设置编码方式php连接mysql数据库时,也就是在mysql_connect()语句之后添加“mysql_query("set names utf8");”语句来设置编码方式。注意:是utf8,不是utf-8;网页字符集也最好选用utf-8。在PHP连接数据…

pandas to_csv参数详解_【Python基础】Pandas数据可视化原来也这么厉害

一、可视化概述在Python中,常见的数据可视化库有3个:matplotlib:最常用的库,可以算作可视化的必备技能库,比较底层,api多,学起来不太容易。seaborn:是建构于matplotlib基础上,能满足…

oracle数据库重建em,oracle 11g em重建报唯一约束错误解决方法

oracle 11g em重建报唯一约束错误解决方法更新时间:2012年11月27日 15:07:33 作者:今天在手工配置Oracle11g的EM时总是报如下错误,也没有找到解决办法,以下是我的解决过程,希望可以帮助你们今天在手工配置Oracle11g的EM时总是报如下错误&am…

爬虫 404 try_Python爬虫MOOC笔记

写在前面的小于碎碎念最近在学习Python爬虫内容,其实很多知识在网上搜索一下都能查到,但是作为自己的一种学习记录,也是回顾与复习呀。这种东西真的变化超级快,以前可以直接爬取的内容,现在很多网站都增加了反爬机制&a…

python调用c++_python高性能编程之Cython篇 第一章

第一节 cython的潜能•Cython是一种编程语言,它将Python与C和C 的静态类型系统相结合。•Cython是一个将Cython源代码转换为高效的C或C 源代码的编译器。然后可以将此源代码编译为Python扩展模块或独立可执行文件。Cython的强大功能来自它结合了Python和C的方式&…

oracle获取序列并赋值,Oracle中序列的使用

数据库设计的三大范式第一条就是独立的表结构中必须有唯一主键来标识表中数据.在以往微软的SQL Server(duo版本)平台上.手动编码实现表中主键.并设定为自增列是极其简单.编码如下:typeidintnotnullprimarykeyidentity(1,1),在Oracle 10G中关于序列(Sequence)的使用.(A)Sequence…

oracle序时账是什么,序时账和明细账区别是什么

序时账和明细账区别:一、定义不同:1、明细账也称明细分类账,是根据总账科目所属的明细科目设置的,,用于分类登记某一类经济业务事项,提供有关明细核算资料。2、而序时账了,也称日记账,是指按照经济业务发生…

ui li 菜单 点击添加下级_【Qt开发】实现系统托盘,托盘菜单,托盘消息

概述系统托盘就是在系统桌面底部特定的区域显示运行的程序。windows在任务栏状态区域,linux在布告栏区域。应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能。演示Demo实现功能:1.应用启动后,任…

5g通用模组是什么_中国移动联合芯讯通发布5G终端、芯片及测试产业报告

11月19日,2020中国移动全球合作伙伴大会以“5G融入百业 数智引领未来”为主题在广州召开,从多个维度展现了中国移动运用5G技术驱动各行业转型升级的强大实力。并于21日在展会现场发布了《5G终端、芯片及测试产业报告》。5G终端、芯片及测试产业报告发布现…