2012-12-18 79 views
2

在我的一個項目中,我們支持使用XML進行數據輸入。由於XML是一個用戶輸入文件,它很有可能是一個有效的XML,但有一些語義錯誤(例如字符串長度大於允許的限制等)。單個元素而不是整個文檔的XML驗證

目前我使用javax.xml.validation.Validator來驗證給定的文檔,但即使一個元素有語義錯誤,這也會失敗。我想要的是能夠跳過這些元素,而不是跳過整個XML。 我知道我們可以爲驗證器設置一個錯誤處理程序,我可以跳過這些錯誤,但這意味着我需要在應用程序代碼中執行語義檢查。

我能想到的一個解決方案是解析XSD並獲取一組限制(如時間戳格式,長度檢查等),然後在解析XML時檢查這些限制。有沒有解決這個問題的優雅或明確的方法?

回答

1

我認爲在這種情況下,你可以

  1. 改寫原來的XSD,使其僅驗證

  2. 用什麼你想讓自己的簡化架構,它可能只是一個屬性文件,元素= rule,rule可以是一個正則表達式,並且可以創建一個自定義驗證器。我認爲這將是比完全成熟的XSD驗證

  3. XSD不是唯一的XML模式語言更快,考慮RELAX NG

1

這不是API文檔中很清楚地說明,但如果你提供驗證()方法與一個DOMSource包裝你想驗證的元素,它應該只驗證該元素下的子樹。

我不能100%確定這是validate()的JDK實現的工作方式,但它肯定是Saxon XSD實現如何解釋spec。

如果你不想與低級別的Java API,來驗證一個特定元素(及其子樹)更簡單的方法是卑躬屈膝使用XQuery:

for $e in //a/b/c[condition=foo] return validate{$e} 

使用XQuery 3.0,你可以嘗試使用/ catch來處理驗證失敗的情況。

相關問題