如何在xpath中给多个salesforce命名空间
How to give multiple namespaces of salesforce in xpath
我收到了来自 salesforce 的回复,如下所示。我需要使用 xpath 来检索 ProfileId。
<queryResponse xmlns="urn:partner.soap.sforce.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sf="urn:sobject.partner.soap.sforce.com">
<result xsi:type="QueryResult">
<done>true</done>
<queryLocator xsi:nil="true"/>
<records xsi:type="sf:sObject">
<sf:type>User</sf:type>
<sf:Id xsi:nil="true"/>
<sf:Username>testuser@test.com</sf:Username>
<sf:ProfileId>00e90000001aVwiAAE</sf:ProfileId>
<sf:Name>user</sf:Name>
<sf:LastName>test</sf:LastName>
<sf:Email>user@test.com</sf:Email>
</records>
<size>1</size>
</result>
</queryResponse>
我使用了在线 xpath 生成器。它给了我下面的 xpath。不过好像不对。
/queryResponse[@xmlns="urn:partner.soap.sforce.com"]/result[@xsi:type="QueryResult"]/records[@xsi:type="sf:sObject"]/sf:ProfileId/text()
您使用的 XPath 生成器似乎没有正确处理 默认命名空间。通常您需要声明一个前缀(此步骤的详细信息因不同的 XPath 处理器而异),比如 d
,引用默认名称空间 URI,即 "urn:partner.soap.sforce.com"。然后使用该前缀来引用该命名空间中的元素(为便于阅读而包装):
/d:queryResponse
/d:result[@xsi:type="QueryResult"]
/d:records[@xsi:type="sf:sObject"]
/sf:ProfileId
/text()
可以创建一个与以前的 XPath 一样工作的纯 XPath,但它会太复杂。为了让你体会一下,以下几乎等同于部分之前的XPath(从/d:records
开始往下):
//*[local-name()='records' and namespace-uri()='urn:partner.soap.sforce.com']
[@*[
namespace-uri()='http://www.w3.org/2001/XMLSchema-instance' and
local-name()='type' and
.="sf:sObject"
]]
/*[local-name()='ProfileId' and namespace-uri()='urn:sobject.partner.soap.sforce.com']
/text()
还有许多其他可能的 XPath 表达式可以从这样的 XML 结构中获得 ProfileId
,最简单的表达式之一,不知道如何使用 XPath 处理器正确声明名称空间前缀,如下所示:
//*[name()='sf:ProfileId']/text()
上面的 return 标签名称等于 'sf:ProfileId' 的元素在 XML 文档中的任何位置。
我收到了来自 salesforce 的回复,如下所示。我需要使用 xpath 来检索 ProfileId。
<queryResponse xmlns="urn:partner.soap.sforce.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sf="urn:sobject.partner.soap.sforce.com">
<result xsi:type="QueryResult">
<done>true</done>
<queryLocator xsi:nil="true"/>
<records xsi:type="sf:sObject">
<sf:type>User</sf:type>
<sf:Id xsi:nil="true"/>
<sf:Username>testuser@test.com</sf:Username>
<sf:ProfileId>00e90000001aVwiAAE</sf:ProfileId>
<sf:Name>user</sf:Name>
<sf:LastName>test</sf:LastName>
<sf:Email>user@test.com</sf:Email>
</records>
<size>1</size>
</result>
</queryResponse>
我使用了在线 xpath 生成器。它给了我下面的 xpath。不过好像不对。
/queryResponse[@xmlns="urn:partner.soap.sforce.com"]/result[@xsi:type="QueryResult"]/records[@xsi:type="sf:sObject"]/sf:ProfileId/text()
您使用的 XPath 生成器似乎没有正确处理 默认命名空间。通常您需要声明一个前缀(此步骤的详细信息因不同的 XPath 处理器而异),比如 d
,引用默认名称空间 URI,即 "urn:partner.soap.sforce.com"。然后使用该前缀来引用该命名空间中的元素(为便于阅读而包装):
/d:queryResponse
/d:result[@xsi:type="QueryResult"]
/d:records[@xsi:type="sf:sObject"]
/sf:ProfileId
/text()
可以创建一个与以前的 XPath 一样工作的纯 XPath,但它会太复杂。为了让你体会一下,以下几乎等同于部分之前的XPath(从/d:records
开始往下):
//*[local-name()='records' and namespace-uri()='urn:partner.soap.sforce.com']
[@*[
namespace-uri()='http://www.w3.org/2001/XMLSchema-instance' and
local-name()='type' and
.="sf:sObject"
]]
/*[local-name()='ProfileId' and namespace-uri()='urn:sobject.partner.soap.sforce.com']
/text()
还有许多其他可能的 XPath 表达式可以从这样的 XML 结构中获得 ProfileId
,最简单的表达式之一,不知道如何使用 XPath 处理器正确声明名称空间前缀,如下所示:
//*[name()='sf:ProfileId']/text()
上面的 return 标签名称等于 'sf:ProfileId' 的元素在 XML 文档中的任何位置。