2011-09-09 108 views
4

我有一個schema.xsd,其中包括並修改XHTML這樣catalog.xml文件的XMLSchema驗證:與實體解決

<xs:redefine schemaLocation="http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd"> 
... 
</xs:redefine> 

現在我已經寫了一個驗證,這

  • 從讀取模式xml文件
  • 使用CatalogManager解決實體

它工作正常,因爲它不會加載網絡中的任何文件,而是發現我的catalog.xml文件中給出的xhtml11.xsd。

public class XmlTemplateValidator implements TemplateValidator 
{ 
    public List<SAXParseException> validate (String xml) throws Exception 
    { 
     Reader input = new StringReader(xml); 
     InputSource inputSource = new InputSource(input); 

     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     factory.setNamespaceAware(true); 
     factory.setValidating(true); 
     SAXParser parser = factory.newSAXParser(); 
     parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); 
     XMLReader reader = parser.getXMLReader(); 
     reader.setEntityResolver(new CatalogResolver()); 
     DefaultErrorHandler handler = new DefaultErrorHandler(); 
     reader.setErrorHandler(handler); 
     reader.parse(inputSource); 
     return handler.getSaxParseExceptions(); 
    } 

} 

現在我想同樣的事情,但我想給我的驗證的內部架構(所以不會讓筆者說,針對其架構應該進行驗證,而是讓驗證決定使用哪種模式。

public class NewXmlTemplateValidator implements TemplateValidator 
{ 
    static final String schemaSource = "schema.xsd"; 

    public List<SAXParseException> validate (String xml) throws Exception 
    { 
     Reader input = new StringReader(xml); 
     SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     URL schemaUrl = getClass().getResource(schemaSource); 
     Schema schema = factory.newSchema(schemaUrl); 
     Validator validator = schema.newValidator(); 
     DefaultErrorHandler handler = new DefaultErrorHandler(); 
     validator.setErrorHandler(handler); 
     Source source = new StreamSource(input); 
     validator.validate(source); 
     return handler.getSaxParseExceptions(); 
    } 
} 

它的工作原理,但它加載所有XHTML文件形成需要相當長的,而不是我想要的網。

所以我想驗證對適當實體解析預定義模式的XML字符串通過catalog.xml定義。

如何輕鬆地將CatalogResolver添加到第二個設置?

回答

7

在第二示例中添加XMLCatalogResolver這樣的:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
URL schemaUrl = getClass().getResource(schemaSource); 
String catalog = getClass().getResource("/catalog.xml").getFile(); 
XMLCatalogResolver resolver = new XMLCatalogResolver(new String[] { catalog }); 
factory.setResourceResolver(resolver);