Java XML解析/验证错误处理

Java XML解析/验证错误处理,java,xml,validation,xml-parsing,sax,Java,Xml,Validation,Xml Parsing,Sax,我试图用Java编写一些东西,接收XML字符串并根据XSD模式对其进行验证,对一些简单的常见错误进行自动错误处理,并输出一个固定的XML字符串 我遇到了用于Validator.validate()函数的SAXErrorHandler接口,但这似乎主要用于报告异常,我不知道如何从中修改XML,除了获取行号/列号,这对于修复问题来说非常繁琐 我还找到了Validator.validate()函数,它有一个源代码和一个结果,并返回增强的XML,据我所知,它只是填充缺少的具有默认值的属性,这是我需要做的

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

我遇到了用于
Validator.validate()
函数的SAX
ErrorHandler
接口,但这似乎主要用于报告异常,我不知道如何从中修改XML,除了获取行号/列号,这对于修复问题来说非常繁琐

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

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


另外,我也不确定
XMLReader
如何与之相适应。

我使用
DocumentBuilderFactory
setValidating(true)
来生成XML验证解析器的实例(即
DocumentBuilder


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

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

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

setValidating
方法的Java文档(1.7)说:

注意,这里的“验证”是指XML建议中定义的验证解析器。换句话说,它本质上只是控制DTD验证。(JAXP 1.2中定义的传统两个属性除外。)

要使用现代模式语言(如W3C XML schema或RELAX NG)而不是DTD,可以将解析器配置为非验证解析器,方法是将setValidating(boolean)方法保留为false,然后使用setSchema(schema)方法将模式与解析器相关联

import javax.xml.validation.Schema;
导入javax.xml.validation.SchemaFactory;
// ...
公共静态void main(字符串args[])引发异常{
如果(args.length==0 | | args.length>2){
System.err.println(“用法:java验证器[]”);
系统出口(1);
}
SchemaFactory sf=SchemaFactory.newInstance(xmlstants.W3C\u XML\u SCHEMA\u NS\u URI);
字符串xsdpath=“book.xsd”;
如果(args.length==2){
xsdpath=args[1];
}
Schema s=sf.newSchema(新文件(xsdpath));
SAXParserFactory=SAXParserFactory.newInstance();
工厂设置验证(假);
factory.setNamespaceAware(true);
工厂设置方案;
XMLReader parser=factory.newSAXParser().getXMLReader();
解析器.setFeature(“http://xml.org/sax/features/namespaces“,对);
解析器.setFeature(“http://xml.org/sax/features/namespace-prefixes“,假);
PrintStream out=新的PrintStream(System.out,true,“UTF-8”);
setContentHandler(新的MyHandler(out));
setErrorHandler(新的DefaultHandler());
parser.parse(args[0]);
}
}

请不要作为一大块文本发布,阅读起来有点痛苦。感谢代码和关于setValidating的部分,我不知道。
setValidating(true)
专门针对DTD而不是W3C XML模式进行验证。还要注意,模式可以是DTD、XSD等。。。DTD、W3CXMLSchema、RELAXNG、Schematron都是模式语言。
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]);
    }
}