2012-10-26 40 views
0

我正在驗證針對多個XSD模式的xml實例。如果驗證失敗,我想確定xml實例失敗的模式。 SAXParseException不包含足夠的信息來確定這一點。確定哪個XSD XML實例在驗證過程中失敗

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); 
Source[] sources = getXsdSources(); 
Schema schema = factory.newSchema(sources); 
Validator validator = schema.newValidator(); 

try { 
    validator.validate(input); 
} catch (SAXParseException e) { 
    // Error handling. 
} 

回答

0

的XercesĴ提供了架構後驗證信息集(PSVI)的訪問所有(?或者可能只幾乎全部),其包括有關元素或屬性經過驗證的類型的信息以及任何無效的性質。有關更多信息,請參閱http://xerces.apache.org/xerces2-j/faq-xs.html#faq-8

如果您使用的驗證器是Xerces J,那麼您需要的信息可用(可能是由您處理的SAXParseException包裝的異常?如果您使用的是另一個驗證器,則可以多瀏覽一下它的API,也可以使用Xerces J.

+0

我最終重構了我的驗證過程,只傳遞了根名稱空間的模式。儘管我仍然無法確定它是主模式還是導入模式,但我認爲將它們指向根模式總比沒有好。我看着Xerces,它可能會工作,但還沒有嘗試過實施它。 –

0

@Joe,以下鏈接可能會對您有所幫助。你可以在前面的Stackoverflow中找到同樣的問題。 Validate an XML File Against Multiple Schema Definitions

+0

我看過那篇文章。 OP的問題是某些模式無法正確解析。我沒有任何加載模式的問題,我試圖做的是找出我的實例失敗的模式。 –

+0

除非當然,我錯過了一些帖子。您能否在您的回答中指出實際的解決方案,而不是在沒有額外發布相關解決方案的情況下引用其他帖子。 (想想看,如果該鏈接變爲死亡,會發生什麼。) –

+0

@Joe:我是java中的新手。我早些時候這樣做了。我已經將StreamInstanceValidator jar文件加載到我的類路徑中,並使用以下命令在命令提示符下進行驗證。 java org.apache.xmlbeans.impl.tool.StreamInstanceValidator -dl%2.xml%5.xsd>%2.txt –

0

您需要單獨驗證每個模式,而不是將它們全部加載到「模式」中。那麼它是一個簡單的問題,將'源'設置'驗證器'列表遍歷到每一個,所以你可以跟蹤哪些是在失敗時加載的。

這不是測試,但應該是有關的權利:

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); 
    Source[] sources = getXsdSources(); 
    foreach(Source s : sources){ 
    Schema schema = factory.newSchema(s); 
    Validator validator = schema.newValidator(); 
    try { 
     validator.validate(input); 
    } catch (SAXParseException e) { 
     // Error handling. 
     System.out.println("failed on " + s.getSystemID) 
    } 
} 
+0

我試過這種方法,我遇到過的挑戰是,如果我針對不是根類型的子模式進行驗證,那麼我會得到'SAXParseException:cvc-elt.1:找不到元素的聲明' S:MyElement''。因此,如果schemaA導入schemaB並在內部元素上使用schemaB,如果我僅針對schemaB進行驗證,則驗證將失敗,並出現上述異常。 –