我尝试在soapUI中针对以下XML创建XPath Match断言,以查看是否存在元素:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns2:executeResponse xmlns:ns2="http://ws.namf09.anzlic.org.au">
<responses id="?" xmlns="http://namf09.anzlic.org.au">
<result status="OK" completed="true" hasErrorsInResponseElements="false"/>
<response id="200.1">
<responseResult>
<address>
<streetNumber1>2</streetNumber1>
<streetName>sydney</streetName>
<streetType>SQ</streetType>
<localityName>sydney</localityName>
<stateTerritory>NSW</stateTerritory>
<postcode>2000</postcode>
</address>
</responseResult>
</response>
</responses>
</ns2:executeResponse>
</soapenv:Body>
</soapenv:Envelope>
我的第一次尝试是boolean(//address)
,soapUI说这是假的。但是,当我让soapUI为我设计namspace时,它已经提出:
declare namespace ns2='http://ws.namf09.anzlic.org.au';
declare namespace ns1='http://namf09.anzlic.org.au';
declare namespace soapenv='http://schemas.xmlsoap.org/soap/envelope/';
boolean(//ns1:address)
这很有效,但我不明白ns1
命名空间的来源。我认为它是默认值,但是如果没有soapUI我怎么能解决这个问题?
答案 0 :(得分:1)
XML文档中的名称空间前缀不必与断言中的名称空间前缀相同。它必须匹配 URI 。对于默认名称空间,URI仍然必须匹配,因此您必须在XPath / XQuery中将其称为 something 。
在您的XML文档中,<address>
元素位于http://namf09.anzlic.org.au
命名空间中,该命名空间引用了国家地址管理框架。
为了给这个URI一个有意义的名字,而不是像ns1
这样纯粹随机的名字,让我们称之为namf
:
declare namespace namf='http://namf09.anzlic.org.au';
boolean(//namf:address)
答案 1 :(得分:0)
nsX 是SoapUI从响应中生成的默认命名空间。
要评估xPath表达式,您需要一个能够运行xPath函数的编辑器。 试试这个在线解析器:
这些函数(API)也可用于Java等程序语言:
What's a simple way in java to evaluate an xpath on a string and return a result string