2013-03-11 24 views
1

這裏適用的條件三倍水平是我從百會CRM在XML和我需要的電子郵件,其中記錄的主要聯繫人的:如何在XPATH

<!--?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[[email protected]]]--> 
      </fl> 
      <fl val="Primary"> 
       <!--[CDATA[true]]--> 
      </fl> 
     </row> 
     <row no="2"> 
      <fl val="CONTACTID">511617845475451213</fl> 
      <fl val="Email"> 
       <!--[CDATA[[email protected]]]--> 
      </fl> 
      <fl val="Primary"> 
       <!--[CDATA[false]]--> 
      </fl> 
     </row> 
     </contacts> 
    </result> 
    </response> 

在上面如果xpath表達式應該返回[email protected]作爲主要人員的電子郵件。

我開始寫作表達爲:

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

,但不能讓過去書寫組合謂詞行元素的點。

另一個問題是命名空間。看起來像這個XML有一個命名空間。在這種情況下如何處理XPATH中的命名空間?

回答

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["),"]]") 
+0

謝謝。但由於某些原因,它無法解析匹配函數。我是否需要提供某個特定的系統名稱空間,還是需要執行與特定級別的實現解析器實現相關的函數執行? – 2013-03-31 06:02:58

+1

如果它不識別匹配(),這意味着您正在使用XPath 1.0。在這種情況下,用contains()替換matches()。 但您無法在位置步驟中使用任何功能,您將不得不在第二步中提取您的電子郵件值。 – 2013-04-02 07:08:08

+0

你能否詳細說明你的意思是兩步?任何指針將不勝感激。 – 2013-04-02 14:23:51

1

這項工作?

//fl[@val='Primary' and contains(text(), 'true')]//preceding-sibling::fl[@val='Email'] 
+0

不幸的是,真正的XML沒有彼此相鄰的這兩個節點。感謝您的輸入。欣賞它。 – 2013-04-03 12:28:57

0

假設那些CDATA部分實際上 CDATA部分,而不是評論,這應該這樣做:

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

據我所知,你的XML不使用命名空間。 uri=只是一個普通的屬性。

+0

無法控制來自外部系統的XML生成。感謝四個輸入。 – 2013-04-03 12:29:49