我有一个schema.xsd
其中包含并修改 xhtml,如下所示:
<xs:redefine schemaLocation="http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd">
...
</xs:redefine>
现在我已经编写了一个验证器,其中
- 从 xml 文件读取架构
- 使用 CatalogManager 来解析实体
它工作正常,因为它不会从网络加载任何文件,而是找到我中给出的 xhtml11.xsdcatalog.xml
file.
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();
}
}
它可以工作,但它确实从网上加载所有 html 文件,这需要相当长的时间,而且不是我想要的。
因此,我想根据预定义模式验证 XML 字符串,并通过 Catalog.xml 定义进行正确的实体解析。
如何轻松地将 CatalogResolver 添加到第二个设置中?