0

我正在尝试用 Java 编写一些东西,它接收 XML 字符串并根据 XSD 模式对其进行验证,并对一些简单的常见错误进行自动错误处理,并输出固定的 XML 字符串。

我遇到了ErrorHandler该函数的 SAX 接口Validator.validate(),但这似乎主要是为了报告异常,我不知道如何从中修改 XML,除了获取行/列号这将是非常乏味的解决问题。

我还找到了Validator.validate()具有源和结果的函数,并返回增强的 XML,据我所知,它只是填充具有默认值的缺失属性,这是我需要做的一部分。

但我还需要修复丢失的开始或结束标签,纠正一个字母拼错的标签,以及类似的东西。有这么多“处理程序”接口(ValidationHandler, ContentHandler, EntityResolver),我不确定要深入了解哪些接口,所以如果有人能指出我正确的方向,那就太好了(我不需要详细的代码示例)。

我也不确定XMLReader这一切是如何适应的。

4

2 回答 2

1

要处理错误,您必须实现接口ErrorHandler或扩展DefaultHandler帮助程序类并重新定义error方法。这就是验证错误所调用的方法。如果您想更精确,我认为您将不得不分析错误消息。我认为 SaX 不会为您提供使错误易于修复的东西。

顺便说一句,请注意,要针对 XSD 进行验证,您不应使用方法setValidating. 请参阅下面的代码。

setValidating方法的Java doc(1.7)说:

请注意,此处的“验证”是指 XML 建议中定义的验证解析器。换句话说,它本质上只是控制 DTD 验证。(除了 JAXP 1.2 中定义的两个遗留属性。)

要使用 W3C XML Schema 或 RELAX NG 等现代模式语言而不是 DTD,您可以通过将 setValidating(boolean) 方法设置为 false 来将解析器配置为非验证解析器,然后使用 setSchema(Schema) 方法关联一个解析器的架构。

import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
// ...
public static void main(String args[]) throws Exception {
        if (args.length == 0 || args.length > 2) {
            System.err.println("Usage: java Validator <doc.xml> [<schema.xsd>]");
            System.exit(1);
        }
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.    W3C_XML_SCHEMA_NS_URI);
        String xsdpath = "book.xsd";
        if (args.length == 2) {
            xsdpath = args[1];
        }
        Schema s = sf.newSchema(new File(xsdpath));
        SAXParserFactory factory = SAXParserFactory.newInstance();
        factory.setValidating(false);
        factory.setNamespaceAware(true);
        factory.setSchema(s);
        
        XMLReader parser = factory.newSAXParser().getXMLReader();
        parser.setFeature("http://xml.org/sax/features/namespaces", true);
        parser.setFeature("http://xml.org/sax/features/namespace-prefixes", false);

        PrintStream out = new PrintStream(System.out, true, "UTF-8");
        parser.setContentHandler(new MyHandler(out));
        parser.setErrorHandler(new DefaultHandler());
        parser.parse(args[0]);
    }
}
于 2013-10-25T04:37:30.907 回答
-1

我用DocumentBuilderFactorywithsetValidating(true)来生成一个 XML 验证解析器的实例(即DocumentBuilder)。

请注意,验证和非验证 XML 解析器都将验证 XML 是否“格式正确”(例如结束标记等)。“验证”是指检查 XML 是否符合 DTD 或模式。

于 2013-10-24T17:34:41.657 回答