如何在此XML中找到<result>标记的XPath?</result>

时间:2015-04-03 19:26:44

标签: xml xpath soapui

我从我正在呼叫的服务中得到此回复。我希望在Soap-UI中编写一个断言来验证<Result>标记的值。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <ServiceResponse> <!--Issue happens here when xmlns attribute is present-->
            <ServiceResult xmlns:a="http://schemas.datacontract.org/2004/07/services.api.DataContracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <AdditionalInfo i:nil="true"/>
                <ErrorMessage/>
                <ErrorMessageId i:nil="true"/>
                <ErrorMessages xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
                <InternalId>0</InternalId>
                <RecordsAffected>0</RecordsAffected>
                <Result>false</Result>
                <WarningMessages xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
                <a:ReturnBase>
                </a:ReturnBase>
            </ServiceResult>
        </ServiceResponse>
    </s:Body>
</s:Envelope>

我使用Xpath Testing tool online找到正确的路径。当我删除<ServiceResponse>标记上的xmlns属性时,XPATH按预期工作。但是,如果xmlns="http://schema.Services"标记上有<ServiceResponse>,则XPath无法返回项目。

我也尝试在Notepad ++中使用XML Tools插件找到它,当我在那里<ServiceResponse xmlns="http://schema.Services">时会抛出异常。

我怎样才能在soap-UI中编写这个断言?

2 个答案:

答案 0 :(得分:0)

XML命名空间的概念是您可以为它们分配任意前缀。

因此,如果您的XML使用默认命名空间,您只需为它构成一个前缀:

declare namespace s='http://schemas.xmlsoap.org/soap/envelope/';
declare namespace serv='http://schema.Services';
/s:Envelope/s:Body/serv:ServiceResponse/serv:ServiceResult/serv:Result[. = 'false']

答案 1 :(得分:0)

SoapUI使用Saxon XPath / XQuery处理器,因此您拥有XPath 2.0。 XPath 2.0的一个好处是名称空间通配符,所以你可以这样做:

/*:Envelope/*:Body/*:ServiceResult