骆驼使用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查询(标签,属性名称,属性值,标签对属性)

XPath 表达式查找标签名称包含“名称”的元素

我们如何使用没有标签名称的 xpath 查找元素? [复制]

使用 xpath 在 Java 中使用名称空间解析 XML

RF库XML测试通过xpath查找元素的说明