2017-03-16 77 views
1

我已經進行了研究和調查,但似乎沒有任何工作。假設我想要一個帶有「Tony's Computer」文本的xpath。我不能做到以下幾點:使用xpath使用撇號(「'」)查找文本

//*[contains(text(), 'Tony's Computer')] 

由於明顯的原因,因爲'在y和s之間不引用正文。但也不這項工作:

//*[contains(text(), 'Tony\'s Computer')] 

//*[contains(text(), 'Tony''s Computer')] 

有沒有辦法逃脫撇號?我找不到任何東西。我能做的最好的是與Java以下(假設textToLookFor有文本查找):

 String[] fields = textToLookFor.split("'"); 
     String textx = ""; 
     for (int indx = 0; indx < fields.length; indx++) { 
      String stext = fields[indx]; 
      String cont = "contains(text(),'" + stext + "') "; 
      if (!textx.isEmpty()) { 
       textx += " and "; 
      } 
      textx += cont; 
     } 
     String xpath = "//*[" + textx + "]"; 

基本上做了

//*[contains(text(),'Tony') and contains(text(), 's Computer')] 

這是我認爲不夠好。但是,這不完全匹配。例如,它可以找到「託尼和鮑勃的計算機」。

有沒有其他人有過這樣的成功?我找不到任何其他解決方案。順便說一句,當我找到元素我可以說字符串顯示= ele.getText();然後檢查顯示的.contains(textToLookFor)。

在這種情況下,我首先需要做一個textToLookFor = textToLookFor.replaceAll(「\」「,」\\\「」);,它可以轉義任何雙引號。

+0

他們建議使用「而不是」或使用\「但這不適用於我。」他們「我的意思是上述可能的重複;-) – Tony

+0

你在使用XPath 1.0嗎? –

+0

@Tony你應該你的代碼顯示了你如何實現'他們'的建議,如何:'String xpath =「//*[contains(.,\""Tony's Computer \」)]「;'? – har07

回答

1

我假設您使用的是XPath 1.0。您是否嘗試過在XPath中使用實體&apos;

//*[contains(text(), 'Tony&apos;s Computer')] 

將單撇號加倍會在XSLT 2.0中起作用。因此,另一種選擇是使用Saxon as your XPath engine,然後使用XPath 2.0,那麼下面將工作:

//*[contains(text(), 'Tony''s Computer')] 
+0

我們不能改變xpath引擎。那麼我必須得到IT的許可,我不認爲我已經嘗試過了,我明天當我回來工作時會嘗試這樣做 – Tony

1
//*[contains(.,"Tony's Computer")] 

爲我工作。在字符串外部使用雙引號。

1

首先,這取決於您的主機語言(對於您的情況Java,對於許多其他人XSLT),因爲您必須考慮哪些字符在XPath中是特殊的,哪些在您的主機語言中是特殊的。一般規則是,編寫滿足XPath規則的表達式,然後使用主機語言轉義來滿足主機語言規則(例如,"在Java中爲\")。主機語言轉義不會幫助您超越XPath規則,因爲在XPath看到字符串時,主機語言轉義已經消失。

XPath允許你使用任何'"作爲字符串分隔符,所以如果只有這些字符出現在字符串中,您可以用其他的作爲分隔符:或'He said "boo!"'。如果您使用的是Java,那麼您將"替換爲\"(如果您使用的是XSLT,請將"替換爲&quot;)。

XPath 2。0還允許使用字符串文字中的定界引號加倍,如果在同一個字符串中同時需要兩種引用,則這很有用:"He said, ""I can't"""'He said, "I can''t"'(同樣,您必須添加Java級別轉義。 )這在1.0中是不可能的,但你可以通過使用concat()來解決它:concat("He said, ", '"', "I can't", '"')

+0

是的我會用\來避免雙引號(例如「\」Tony's Computer \「」。也許我們仍在使用xpath 1.0?我也嘗試了單引號的反斜線(如contains(text(),'Tony''s Computer')]。 – Tony

+0

如果它不起作用,請告訴我們你是什麼在做什麼以及如何失敗,如果它在工作g,然後接受答案。 –