2012-08-07 47 views
6

我正在嘗試執行xml驗證。我在運行時給出了一個模式列表(可能用jar包裝)。根據我向SchemaFactory提供架構的順序,驗證通過或失敗。驗證XML在運行時加載架構,失敗取決於架構順序

下面是我在做什麼:

private void validateXml(String xml, List<URI> schemas){ 
     Source[] source = new StreamSource[schemas.size()]; 
     int i=0; 
     for (URI f : schemas){ 
      source[i++] = new StreamSource(f.openStream()); 
     } 

     SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NA_URI); 
     sf.setResourceResolver(new MyClassPathResourceResolver()); 

     Schema schema = schemaFactory.newSchema(source); 
     Validator validator = schema.newValidator(); 
     validator.validate(new StreamSource(new ByteArrayInputStream(xml.getBytes())); 

又來了,這如果傳遞的集架構不架構開始未能將XML referrs的根元素。有沒有解決這個問題,還是我做錯了什麼?

+0

你可以在哪裏發佈模式和XML嗎? – davidfmatheson 2012-08-22 12:46:16

+0

@davidfmatheson不幸的是,這是不可能的,我可以說它是一組模式,根模式和第二模式,它們允許用不同的標記替換第一模式的主體。 – 2012-08-22 12:54:01

回答

5

默認情況下,如果模式文檔已經具有相同命名空間的模式文檔,則Xerces將忽略模式文檔。這種行爲可以使用廠家的選項

http://apache.org/xml/features/validation/schema/handle-multiple-imports

+0

我在這個鏈接中獲得一個HTTP 404,你能提供一些額外的細節嗎? – 2012-08-08 12:12:37

+0

另外,我需要加載2個模式(每個模式導入加入模式)。如果我按照正確的順序加載它們,一切都很好。否則,沒有快樂。這兩個模式具有不同的目標空格。 – 2012-08-08 12:13:36

+0

嘗試搜索它,而不是將其用作URL。這是一個JAXP選項名稱而不是URL。 (好吧,有些瀏覽器通過結合地址欄和搜索欄來實現這一點很困難,通過轉到google.com以舊的方式進行)。 – 2012-08-10 19:46:29

0

首先被改變,你必須通過調用registerErrorHandler()方法設置org.xml.sax.ErrorHandler對象對XML閱讀器的實例。您可能會收到一些警告,讓您知道問題。

其次,你必須知道你正在使用哪個xml庫。在你的代碼中調用schemaFactory.getClass()。getName()並打印它。知道庫之後,如果它支持功能來打開/關閉多個模式導入,則可以參考它的文檔。

+0

類是'com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory' – 2012-08-28 16:10:43