首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java分析/验证错误处理

Java分析/验证错误处理
EN

Stack Overflow用户
提问于 2013-10-24 17:16:05
回答 2查看 3K关注 0票数 1

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

我遇到了用于Validator.validate()函数的SAX Validator.validate()接口,但这似乎主要是为了报告异常,除了获得行/列编号之外,我不知道如何从它修改XML,这将是非常繁琐的修复问题。

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

但是我也需要一些东西,比如修复一个缺失的开始或结束标记,以及纠正一个被字母拼写错误的标签,等等。"Handler“接口太多了(ValidationHandlerContentHandlerEntityResolver),所以我不确定应该深入研究哪些接口,所以如果有人能指出正确的方向,那就太棒了(我不需要一个详细的代码示例)。

而且,我也不知道XMLReader是如何适应这一切的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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 )方法将模式关联到解析器。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-10-24 17:34:41

我已经使用DocumentBuilderFactorysetValidating(true)一起生成了XMLValuing解析器(即DocumentBuilder)的实例。

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19572395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档