2013-10-24 84 views
0

我想在Java中写一些接收XML字符串并根据XSD模式验证它的东西,并对一些简单的常见错误进行自动错误处理,并输出一个固定的XML字符串。Java XML解析/验证错误处理

我遇到了Validator.validate()函数的SAX ErrorHandler接口,但这似乎主要是为了报告异常,我无法弄清楚如何从中修改XML,除了获取行/列号解决问题将非常繁琐。

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

但我还需要沿着修复缺少的开始或结束标记,纠正一个字母拼写错误的标记等等。有很多“Handler”接口(ValidationHandler,ContentHandler,EntityResolver),我不确定要深入研究哪些接口,所以如果有人能指出我的方向是正确的,那就太棒了(我不需要详细的代码示例)。我也不确定XMLReader如何适应这一切。

+0

请不要张贴作为文本的一个巨大的块,它有点痛苦阅读。 –

回答

1

要处理错误,您必须实现接口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; 
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]); 
    } 
} 
+1

感谢您的代码和关于setValidating的部分,我不知道这一点。 – KingJustinian

-1

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

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

+0

'setValidating(true)'特别针对DTD而不是W3C XML模式进行验证。另请注意,模式可以是DTD,XSD,... DTD,W3C XML模式,Relax NG,Schematron都是模式语言。 – lkuty