我试图用Java编写一些东西,接收XML字符串并根据XSD模式验证它,并对一些简单的常见错误进行自动错误处理,并输出一个固定的XML字符串。
我遇到了用于Validator.validate()函数的SAX Validator.validate()接口,但这似乎主要是为了报告异常,除了获得行/列编号之外,我不知道如何从它修改XML,这将是非常繁琐的修复问题。
我还找到了具有源和结果的Validator.validate()函数,并返回增广的XML,据我所知,它只是填充了缺少的具有默认值的属性,这是我需要做的工作的一部分。
但是我也需要一些东西,比如修复一个缺失的开始或结束标记,以及纠正一个被字母拼写错误的标签,等等。"Handler“接口太多了(ValidationHandler、ContentHandler、EntityResolver),所以我不确定应该深入研究哪些接口,所以如果有人能指出正确的方向,那就太棒了(我不需要一个详细的代码示例)。
而且,我也不知道XMLReader是如何适应这一切的。
发布于 2013-10-25 04:37:30
要处理错误,您必须实现接口ErrorHandler或扩展DefaultHandler助手类并重新定义error方法。这是为验证错误调用的方法。如果您想要更精确,我认为您将不得不分析错误信息。我不认为SaX会给您带来一些容易修复错误的东西。
顺便说一下,要对XSD进行验证,不应该使用setValidating方法。请看下面的代码。
setValidating方法的Java (1.7)说:
注意,这里的“验证”意味着XML建议中定义的验证解析器。换句话说,它基本上只是控制DTD验证。(除了JAXP1.2中定义的遗留两个属性之外。) 若要使用现代模式语言(如W3C setSchema或RELAX而不是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-24 17:34:41
我已经使用DocumentBuilderFactory与setValidating(true)一起生成了XMLValuing解析器(即DocumentBuilder)的实例。
请注意,验证和非验证XML解析器都将验证XML是否“格式良好”(例如,结束标记等)。“验证”指的是检查XML是否符合DTD或模式。
https://stackoverflow.com/questions/19572395
复制相似问题