无法使用给定 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 page,local-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"/>
所以,您可以精确计算值的方式都非常完美
我正在尝试使用 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 page,local-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"/>
所以,您可以精确计算值的方式都非常完美