2014-07-14 37 views
1

我目前正在使用XPath處理Java項目,因爲我不是XPath專家,所以我需要找到一種方法來驗證隨機XPath表達式的語法,而不將它們與XML數據進行匹配。XPath表達式語法驗證

我在網上發現了很多XPath驗證器,不幸的是他們都需要XML數據。

我的當務之急是驗證下面的表達式:

/cXML/Request/OrderRequest/OrderRequestHeader/Extrinsic/@name[NameOrder]/Name 

我會很感激在這一個特定的有效性評論...

回答

2

我假設你想驗證語法而不是如果表達式在您的xml或xml架構的上下文中有效。您可以使用compile(..)方法,如果xpath在語法上不正確,它將引發異常。

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
XPathExpression expr = xpath.compile("//book[author='Abc']/title/text()"); 
+0

謝謝,很高興知道。所以我的追求實際上是在這裏結束:這是我正在尋找的驗證者,它會告訴我語法是否正確,但不幸的是,永遠不會告訴我表達式是否有意義,正如邁克爾指出的那樣...... –

3

「由於您不是XPath專家」,因此您在XPath表達式中犯的大多數錯誤可能不是語法錯誤,而是語義錯誤。可悲的是,XPath表達式中的大多數錯誤不會被檢測爲語法錯誤或運行時錯誤,而只會導致錯誤的答案。 (XPath在這方面與正則表達式非常相似)。

您的示例就是一個例子。它在語法上是有效的,但決不會選擇任何東西。這是因爲它包含步驟@name[NameOrder],它選擇具有NameOrder子元素的所有「name」屬性。屬性從來沒有孩子,所以沒有什麼能滿足這個表達。撒克遜會給你一個警告,但這不是一個語法錯誤。

所以我不認爲你做語法驗證的方法會幫助你很多。

+0

謝謝Michael,實際上這很令人驚訝:XPath標準允許不會選擇任何數據的XPath表達式。在這方面,當然,我的追求沒有太大的目的...... –