骆驼使用xpath检索xml标签名称
Posted
技术标签:
【中文标题】骆驼使用xpath检索xml标签名称【英文标题】:Camel retrieving xml tag name using xpath 【发布时间】:2016-09-29 12:52:30 【问题描述】:我无法让 xpath 表达式工作。我正在使用骆驼 2.15.1。任何帮助将不胜感激。
我尝试了以下方法
<xpath>name(//*[1])='PPR_PC2'</xpath>
<xpath>name("//*[local-name()='PPR_PC2')</xpath>
<xpath>//PPR_PC2</xpath>
我的 xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<PPR_PC2 xmlns="urn:hl7-org:v2xml">
<MSH>
<MSH.1>|</MSH.1>
...
...
</MSH>
...
...
</PPR_PC2>
我的骆驼路线
<route id="_route_1">
<from uri="activemq:queue:myQIN"/>
<doTry>
<choice>
<when>
// This path works without having namespace
<xpath>name(//*[1])='PPR_PC2'</xpath>
<to uri="xslt:transform/stylesheet.xsl"/>
<to uri="..."/>
</when>
<otherwise> ... </otherwise>
</choice>
<doCatch> ... </doCatch>
</doTry>
</route>
这是我遇到的错误
[thread #1 - JmsConsumer[myQIN]] EndpointMessageListener
WARN Execution of JMS message listener failed.
Caused by: [org.apache.camel.builder.xml.InvalidXPathExpression - Invalid xpath: name(//*[1])='PPR_PC2'.
Reason: javax.xml.xpath.XPathExpressionException: net.sf.saxon.trans.XPathException:
A sequence of more than one item is not allowed as the first argument of name() (<PPR_PC2/>, <MSH/>, ...) ]
org.apache.camel.builder.xml.InvalidXPathExpression:
Invalid xpath: name(//*[1])='PPR_PC2'.
Reason: javax.xml.xpath.XPathExpressionException: net.sf.saxon.trans.XPathException:
A sequence of more than one item is not allowed as the first argument of name() (<PPR_PC2/>, <MSH/>, ...)
【问题讨论】:
【参考方案1】:错误信息
name() 的第一个参数不允许包含多个项目的序列
建议你写的时候
name(//*[1])
(选择其父元素的第一个子元素)
你可能是说
name((//*)[1])
(选择文档中的第一个元素)
虽然这会给你带来完全相同的效果
name(/*)
【讨论】:
【参考方案2】:声明命名空间并使用它。请注意下面的xmlns
。
<route id="_route_1" xmlns:hl7="urn:hl7-org:v2xml">
<from uri="activemq:queue:myQIN"/>
<doTry>
<choice>
<when>
<xpath>/hl7:PPR_PC2</xpath>
<to uri="xslt:transform/stylesheet.xsl"/>
<to uri="..."/>
</when>
<otherwise> ... </otherwise>
</choice>
<doCatch> ... </doCatch>
</doTry>
</route>
您可以选择任何您喜欢的前缀,但您必须选择一个前缀才能声明和使用命名空间。我选择hl7
作为示例。
在您的 XML 文件中声明较高的命名空间,以便能够在多个地方使用它。
另请阅读how to use xpath in camel-context.xml to check if a particular node is exist or not
【讨论】:
【参考方案3】:尝试使用:
Namespaces ns = new Namespaces("cus","http://...");
ns.xpath("//MSH.1/text()", java.lang.String.class)
【讨论】:
以上是关于骆驼使用xpath检索xml标签名称的主要内容,如果未能解决你的问题,请参考以下文章
如何从 XML 中仅提取标签名称(而不是值),最终使用 XPath
Python通过lxml库遍历xml通过xpath查询(标签,属性名称,属性值,标签对属性)