当前位置:  开发笔记 > Android > 正文

如何使用Xpath检索XML文件中的命名空间

如何解决《如何使用Xpath检索XML文件中的命名空间》经验,为你挑选了2个好方法。

我有一个XML文件,如下所示:


我将不得不打开很多这些文件.每个命名空间都有不同的命名空间,但一次只有一个命名空间(我永远不会在一个xml文件中找到两个命名空间).

使用XPath我想有一种自动方式将给定的命名空间添加到命名空间管理器.到目前为止,我只能通过解析xml文件来获取命名空间,但我有一个XPathNavigator实例,它应该有一个很好的,干净的方式来获取命名空间,对吧?

- 要么 -

鉴于我只有一个命名空间,以某种方式使XPath使用xml中唯一存在的命名空间,从而通过始终附加命名空间来避免混乱代码.



1> JeniT..:

您可以尝试一些技巧; 您使用的将取决于您需要从文档中获取哪些信息,您想要的严格程度以及您正在使用的XPath实现的一致性.

获取与特定前缀关联的名称空间URI的一种方法是使用namespace::轴.这将为您提供一个命名空间节点,其名称为前缀,其值为命名空间URI.例如,您可以使用以下路径获取文档元素上的默认名称空间URI:

/*/namespace::*[name()='']

您可以使用它来为XPathNavigator设置名称空间关联.但是要注意,namespace::轴是XPath 1.0的那些并不总是实现的角落之一.

获取该命名空间URI的第二种方法是使用namespace-uri()文档元素上的函数(您已经说过该函数将始终位于该命名空间中).表达方式:

namespace-uri(/*)

将为您提供该命名空间.

另一种方法是忘记将前缀与该命名空间相关联,并使您的路径无名称空间.您可以local-name()在需要引用您不知道其命名空间的元素时使用该函数来执行此操作.例如:

//*[local-name() = 'Element']

您可以更进一步,如果您真的想要,则针对文档元素之一测试元素的名称空间URI:

//*[local-name() = 'Element' and namespace-uri() = namespace-uri(/*)]

鉴于命名空间似乎对您没有任何意义,最后一个选项是通过剥离名称空间的过滤器来运行XML.然后你根本不必在XPath中担心它们.最简单的方法是xmlns使用正则表达式删除属性,但如果您需要同时进行其他整理,则可以执行更复杂的操作.


仅供参考:在XPath版本2.0中,[名称空间轴已弃用](http://www.w3.org/TR/xpath20/#dt-in-scope-namespaces).
非常感谢您的详细解答我似乎没有声誉可以投票给您

2> Dimitre Nova..:

这个40行xslt转换提供了有关给定XML文档中命名空间的所有有用信息:












  
    
      
    
  

  

  
          
            
              
                
              
            
          
  

应用于以下XML文档时:


  
    
  
  
    
      
    
  
  

产生了想要的结果:


   
      
      
      
   
   
      
      
   
   
      
      
   

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有