1

这是我从 Zoho CRM 获得的 XML,我需要获取记录主要联系人的电子邮件:

<!--?xml version="1.0" encoding="UTF-8" ?-->
  <response uri="/crm/private/xml/Contacts/getRelatedRecords">
     <result>
       <contacts>
        <row no="1">
           <fl val="CONTACTID">511618000000889989</fl>
           <fl val="Email">
               <!--[CDATA[person1@example.com]]-->
           </fl>
           <fl val="Primary">
               <!--[CDATA[true]]-->
           </fl>
        </row>
        <row no="2">
           <fl val="CONTACTID">511617845475451213</fl>
           <fl val="Email">
              <!--[CDATA[person2@example.com]]-->
           </fl>
           <fl val="Primary">
              <!--[CDATA[false]]-->
           </fl>
        </row>
       </contacts>
     </result>
  </response>

在上述情况下,xpath 表达式应返回 person1@example.com 作为主要人员的电子邮件。

我开始将表达式写为:

/response/result/contacts/row[./fl/@val='Primary' and ]/fl[@val='Email']/text()

但无法超越为行元素编写组合谓词的点。

另一个问题是命名空间。似乎这个 XML 有一个命名空间。在这种情况下如何处理 XPATH 中的命名空间?

4

3 回答 3

1

这行得通吗?

//fl[@val='Primary' and contains(text(), 'true')]//preceding-sibling::fl[@val='Email']
于 2013-03-11T18:48:21.897 回答
1

您的 CDATA 部分不应写为注释。假设你更换

<!--[CDATA[true]]-->

<![CDATA[true]]>

你可以得到你的地址

//row[fl[@val="Primary" and matches(text(),"true")]]/fl[@val="Email"]/text()

如果现在您无法控制 CDATA 的生成,并且想将它们视为注释,请选择

//row[fl[@val="Primary" and matches(comment(),"true")]]/fl[@val="Email"]/substring-before(substring-after(comment(),"CDATA["),"]]")
于 2013-03-12T08:34:53.827 回答
0

假设这些CDATA部分实际上CDATA 部分而不是评论,应该这样做:

/response/result/contacts/row[normalize-space(fl[@val = 'Primary]) = 'true']
                             /fl[@val = 'Email']

据我所知,您的 XML 不使用名称空间。uri=只是一个普通的属性。

于 2013-03-11T19:25:19.483 回答