【问题标题】:XMLSchema validation with Catalog.xml file for entity resolving使用 Catalog.xml 文件进行 XMLSchema 验证以进行实体解析
【发布时间】:2011-11-13 22:58:12
【问题描述】:

我有一个schema.xsd,它包含和修改 xhtml,如下所示:

<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 添加到第二个设置中?

【问题讨论】:

    标签: java xml validation xsd


    【解决方案1】:

    在第二个示例中添加一个 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多