如何在xpath中定义默认的salesforce命名空间

时间:2015-08-11 19:07:09

标签: xml xpath namespaces salesforce

调用salesforce API时,我得到一个如下对象:

<getUserInfoResponse xmlns="urn:partner.soap.sforce.com">
   <result>
      <accessibilityMode>false</accessibilityMode>
      <currencySymbol>$</currencySymbol>
      <orgAttachmentFileSizeLimit>5242880</orgAttachmentFileSizeLimit>
      <orgDefaultCurrencyIsoCode>USD</orgDefaultCurrencyIsoCode>
      <orgDisallowHtmlAttachments>false</orgDisallowHtmlAttachments>
      <orgHasPersonAccounts>false</orgHasPersonAccounts>
      <organizationId>xxxxx</organizationId>
      <organizationMultiCurrency>false</organizationMultiCurrency>
      <organizationName>WSO2</organizationName>
      <profileId>00e90000001tKNwAAM</profileId>
      <roleId xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
      <sessionSecondsValid>7200</sessionSecondsValid>
      <userDefaultCurrencyIsoCode xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
      <userEmail>xxxx@gmail.com</userEmail>
      <userFullName>UserSF SalesForce</userFullName>
      <userId>00590000002mYukAAE</userId>
      <userLanguage>en_US</userLanguage>
      <userLocale>en_US</userLocale>
      <userName>xxxx@gmail.com</userName>
      <userTimeZone>America/Los_Angeles</userTimeZone>
      <userType>Standard</userType>
      <userUiSkin>Theme3</userUiSkin>
   </result>
</getUserInfoResponse>

我需要提取&#39; userEmail&#39;使用xpath。

有人可以告诉我使用的确切xpath吗?

使用http://www.freeformatter.com/xpath-tester.html进行试用时,会出现如下错误。

XPath查询的默认(无前缀)命名空间URI始终是&#39;&#39;并且无法将其重新定义为“partner.soap.sforce.com&#39;。

1 个答案:

答案 0 :(得分:3)

请注意您链接到的页面上的粗体警告:

  

XPath测试程序完全支持XML名称空间,但是声明   必须是显式的,必须在根XML元素上。查看XPath   示例部分详细信息。

换句话说,他们完全支持XML名称空间......只有那些在最外层元素上声明的名称空间。这是一个懒惰的黑客,因为它意味着有很多XML无法使用他们的工具,例如你的例子。幸运的是,您的示例可以手动调整以适应其限制而不会有太多麻烦,但其他人不能(例如,当不同的命名空间映射到文档的不同部分中的相同前缀时)。

更糟糕的是,他们没有预先告诉你的是他们根本不支持声明默认命名空间,即使是在最外面的元素上也是如此。这使得更大,更常见的XML文档类无法使用其工具。

解决方案:切换到更好的工具,例如XPath Tester

P.S。如果您确实想要使用FreeFormatter(为什么?),您可以声明sforce名称空间的前缀:

 xmlns:sf="urn:partner.soap.sforce.com"

然后将sf命名空间前缀添加到XML和XPath表达式中的每个元素名称。你也可以摆脱

xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

命名空间声明,因为它们没有被使用,FreeFormatter也不喜欢它们。