2016-06-08 64 views
1

考虑以下三条XML的:通过查找元素名称区分大小写的搜索

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <body> 
     <customerSearchRequest> 
      <id>1234</id> 
     </customerSearchRequest> 
    </body> 
</root> 

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <BODY> 
     <userSearchRequest> 
      <id>5678</id> 
     </userSearchRequest> 
    </BODY> 
</root> 


<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <Body> 
     <orderSearchRequest> 
      <id>9101</id> 
     </orderSearchRequest> 
    </Body> 
</root> 

我需要提取的body(即customerSearchRequestuserSearchRequestorderSearchRequest)第一孩子的名字,这是我我目前做如下:

name(//SOAP-ENV:body/*[1]) 

的问题是,这只适用于作为body第一个请求是区分大小写的。如何使路径不区分大小写?

感谢您的指点。

回答

1

我会去与这样的:

name(//SOAP-ENV:*[translate(local-name(),'BODY','body')='body']/*[1]) 

下面部分首先找到在SOAP-ENV命名空间的元素,然后筛选出那些有本地名称等于“身体”,不区分大小写:

//SOAP-ENV:*[translate(local-name(),'BODY','body')='body'] 

如果你有XPath 2.0中可用,也可以在一个更清洁的方式使用lower-case()upper-case(),或基于正则表达式的功能做过这样matches()case-insensitive matching in xpath?

+1

正确的答案,但也要注意OP应该考虑推回负责XML的团队,以便在单个案例约定上标准化,因为'body','BODY'和'Body'实际上是三个不同的元素。 – kjhughes

+0

我使用logstash,它使用Nokogiri,它不支持XPath 2,所以我最终的解决方案是'local-name(// * [translate(local-name(),'BODY','body')='体']/* [1])' –