如何在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()

demo

可以创建一个与以前的 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 文档中的任何位置。