热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

是否需要在根元素中声明XML命名空间以便通过XPath查询进行匹配?

如何解决《是否需要在根元素中声明XML命名空间以便通过XPath查询进行匹配?》经验,为你挑选了1个好方法。

我无法弄清楚XPath本身是否应该受到指责,或者是否是特定的XPath实现使得这一点变得如此困难.问题 - 如何使用MSDeploy Parameters.xml文件更改名称空间中的XML元素? - 是我的灵感.

什么行不通

这是不起作用的基本示例.

XML:


    
    

XPath的:

//spring/objects/object[@id='CultureResolver']/@type

XPath查询不返回任何内容,而不是:

Spring.Globalization.Resolvers.SessionCultureResolver, Spring.Web
我期待的工作

我或许天真地希望以下方面有效.

修改后的XML:


    
        
              
            
        
    

修改过的XPath查询:

//spring/spring:objects/spring:object[@id='CultureResolver']/@type

此查询在我使用的在线测试程序中引发错误:

ERROR - Failed to evaluate XPath expression: org.apache.xpath.domapi.XPathStylesheetDOM3Exception: Prefix must resolve to a namespace: spring
什么工作

修改后的XML:


    
        
              
            
        
    

修改过的XPath查询(与我期望的工作相同):

//spring/spring:objects/spring:object[@id='CultureResolver']/@type

为了增加混淆,我发现以下XPath查询适用于原始示例XML(在在线测试器XPath引擎中):

//spring/*[local-name() = 'objects' and namespace-uri() = 'http://www.springframework.net']/*[@id='CultureResolver' and local-name() = 'object' and namespace-uri() = 'http://www.springframework.net']/@type
为什么?

由于命名空间和前缀之间的相互作用,这是否令人困惑?似乎声明没有前缀的命名空间不仅包括该命名空间中的相关元素,而且还包括其所有子节点,因此将其描述为"默认命名空间"(如在相关问题的答案中).声明带前缀的命名空间甚至不包含该命名空间中的相关元素!

是否有某些原因需要将名称空间包含在XML文档的根元素中,而不依赖于特定的XPath实现?

我的XPath引擎

我试图解决的问题涉及Microsoft Web Deploy(MSDeploy)使用的任何XPath引擎.

我也在使用这个在线XPath测试器.



1> Mathias Müll..:

一个有趣且问题很好的问题!据我所知,难点在于XPath引擎处理输入文档中的命名空间声明的方式.

简短的回答

不,这种行为一般与XPath或XPath规范无关.这是由于个别实施.


规格说什么

就XML和XPath规范而言,名称空间可以在任何元素上声明,并且最外层(或"根")元素没有什么特别之处.根元素上的命名空间声明就像任何其他声明一样.

当然还有规则.例如,前缀必须与使用其QName的元素上的名称空间URI相关联,或者与该元素(或该属性)的祖先相关联.所以,以下不是格式良好的XML:


    

第二个重要规则:默认命名空间只能应用于声明它的元素和所有后代元素.在以下文档中,root元素根本没有命名空间:


   
      
   

我所讨论的规范是XML,XML命名空间和Xpath规范.

在XPath的实现中会发生什么

现在,如果针对XML文档计算XPath表达式,则此输入文档中存在的所有名称空间声明也必须明确地可用于(声明或"注册")到XPath引擎.

的XPath的一些实施方式通过简单地简化这个重新声明所有命名空间声明是在范围为元素或属性,可作为一个XPath引擎(也参见输入XML文档的这个).

在您的情况下,似乎只考虑在最外层元素上做出的声明.这就是你上一篇XML文档的原因:


    
        
              
            
        
    

works - 因为名称空间声明是在根元素上进行的,并且您从根元素执行XPath表达式.您可以省略默认命名空间的未声明,因为它没有任何效果.


最后,回答你的上一个问题:

是否有某些原因需要将名称空间包含在XML文档的根元素中,而不依赖于特定的XPath实现?

不,没有理由命名空间声明应该在根元素上,除了

在我看来,它们在根元素上声明时更容易找到(非常主观)

如果您想为整个文档声明默认命名空间.在根元素上声明它是使它也适用于根元素的唯一方法

如果根元素本身具有限定名称,即带有前缀.然后,您必须在根元素上声明此前缀和名称空间URI.

如果您的XPath实现自动重新声明范围内的命名空间声明,您当然可以利用它,但有时也会让您感到困惑,正如您所注意到的那样.


@Dabbler你以一种暴露相关信息的方式做了很好的辩论 - XPath引擎实现与XPath规范不同.很高兴知道!为了添加到'参数',我链接的在线测试器似乎也将冒号作为限定名称处理,并且如果它作为前缀解释的内容与命名空间声明不匹配则会抱怨.我怀疑Web Deploy使用的XPath引擎可能是相同的.
推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
author-avatar
__-霖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有