无法使用给定 xml 的 mule 表达式形成 xpath

Not able to form xpath using mule expression for given xml

我正在尝试使用 mule 中的表达式从 xml 读取数据,但出现以下异常:

java.lang.RuntimeException: org.mule.api.MuleRuntimeException: Failed to evaluate XPath expression: "//*[xpath:local-name()="oa:ID"]/text()"

下面给出流程

<flow name="testauditFlow1" doc:name="testauditFlow1">
        <http:inbound-endpoint exchange-pattern="one-way"
            host="localhost" port="8086" path="test" doc:name="HTTP"/>
            doc:name="DOM to XML" />
        <expression-component doc:name="Expression"><![CDATA[#[xpath('//*[xpath:local-name()="ID"]/text()').text]]]></expression-component>
        <logger level="INFO" doc:name="Logger" />
    </flow>

我用的xml如下

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <_ord:ProcessOrder releaseID="9.0" versionID="7.0.0.0" xmlns:_ord="http://www.test.com/xmlns/test" xmlns:_wcf="http://www.test.com/xmlns/test/9" xmlns:oa="http://www.test.com/xmlns/test/foundation">
         <oa:ApplicationArea xsi:type="_wcf:ApplicationAreaType">
            <oa:CreationDateTime>2012-08-07T13:25:01.337Z</oa:CreationDateTime>
            <oa:ID>1234566</oa:ID>
            <_wcf:BusinessContext/>
         </oa:ApplicationArea>
      </_ord:ProcessOrder>
   </soapenv:Body>
</soapenv:Envelope>

你有什么理由需要在这个表达式中使用 xpath:

<expression-component doc:name="Expression">#[xpath('//*[local-name()="ID"]/text()')]</expression-component>

根据this pagelocal-name()函数不需要前缀。另外,我不确定你为什么把整个放在 CDATA 部分。

好吧,我可以使用 XPATH 提取值...您可以通过两种方式完成:-

1) 第一种方法是使用 local-name 而没有 namespace :-

<logger message="Value of id : #[xpath://.[xpath:local-name()='ID']]" level="INFO" doc:name="Logger"/> 

它工作完美且简单,但 XPATH 是一种旧方法,在 Mule 中可能会被贬低

2) 第二种方式也是最有效的方式是使用 mulexml:namespace-manager 如下:- 首先你在流程之前的 Mule 配置中使用 mulexml:namespace-manager:-

<mulexml:namespace-manager includeConfigNamespaces="false">
    <mulexml:namespace prefix="soapenv" uri="http://schemas.xmlsoap.org/soap/envelope/"/>
    <mulexml:namespace prefix="xsi" uri="http://www.w3.org/2001/XMLSchema-instance"/>
    <mulexml:namespace prefix="soapenc" uri="http://schemas.xmlsoap.org/soap/encoding/"/>
    <mulexml:namespace prefix="xsd" uri="http://www.w3.org/2001/XMLSchema"/>
    <mulexml:namespace prefix="_ord" uri="http://www.test.com/xmlns/test"/>
    <mulexml:namespace prefix="_wcf" uri="http://www.test.com/xmlns/test/9"/>
    <mulexml:namespace prefix="oa" uri="http://www.test.com/xmlns/test/foundation"/>
</mulexml:namespace-manager> 

然后使用以下 XPATH 检索值,就像我在记录器中所做的那样:-

<logger message="Value of id : #[xpath('//_ord:ProcessOrder/oa:ApplicationArea/oa:ID/text()').text]" level="INFO" doc:name="Logger"/>  

所以,您可以精确计算值的方式都非常完美