Java中的XML语法验证

Hri*_*sto 34 java xml validation syntax

我一直在试图弄清楚如何检查XML文件的语法,确保所有标签都关闭,没有随机字符等...我现在关心的是确保没有破坏的XML文件.

我一直在看一些这样的SO帖子......

...但我意识到我不想验证XML文件的结构; 我不想验证XML Schema(XSD)...我只是想检查XML语法并确定它是否正确.

Jam*_*ice 47

您可以使用以下代码检查XML文档是否格式正确:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);

DocumentBuilder builder = factory.newDocumentBuilder();

builder.setErrorHandler(new SimpleErrorHandler());    
// the "parse" method also validates XML, will throw an exception if misformatted
Document document = builder.parse(new InputSource("document.xml"));
Run Code Online (Sandbox Code Playgroud)

SimpleErrorHandler上述代码中提到的类如下:

public class SimpleErrorHandler implements ErrorHandler {
    public void warning(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }

    public void error(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }

    public void fatalError(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

这来自这个网站,它提供了使用Java验证XML的各种方法.另请注意,此方法将整个DOM树加载到内存中,如果要保存在RAM上,请参阅备选注释.


Sta*_*Man 5

您要问的是如何验证一段内容是格式良好的XML文档.这很容易通过简单地让XML解析器(尝试)解析有问题的内容来完成 - 如果有问题,解析器将通过抛出异常来报告错误.真的没有更多的东西; 所以你需要的是弄清楚如何解析XML文档.

关于唯一需要注意的是,一些声称是XML解析器的lib并不是真正适当的解析器,因为它们实际上可能无法验证XML解析器必须做的事情(根据XML规范) - 在Java中,Javolution就是一个例子一些几乎没有检查的东西; VTD-XML和XPP3进行一些验证(但不是所有必需的检查).而在频谱的另一端,Xerces和Woodstox会检查规范要求的所有内容.Xerces与JDK捆绑在一起; 此外,大多数Web服务框架都捆绑了Woodstox.

由于已接受的答案已经显示了如何将内容解析为DOM文档(从解析开始),这可能就足够了.唯一需要注意的是,这需要您提供3-5倍于输入文档原始大小的内存.要解决此限制,您可以使用流式解析器,例如Woodstox(实现标准Stax API).如果是这样,您将创建一个XMLStreamReader,reader.next()只要reader.hasNext()返回true 就调用.