Java 中的 XML 语法验证 [已关闭]

2022-09-01 06:46:23

我一直在尝试弄清楚如何检查XML文件的语法,确保所有标签都已关闭,没有随机字符等...此时,我所关心的只是确保文件中没有损坏的 XML。

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

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


答案 1

您可以使用以下代码检查 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"));

上述代码中提到的类如下: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());
    }
}

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


答案 2

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

唯一需要注意的是,一些声称是XML解析器的库并不是真正正确的解析器,因为它们实际上可能不会验证XML解析器必须做的事情(根据XML规范) - 在Java中,Javolution是一个很少或不需要检查的例子;VTD-XML 和 XPP3 执行一些验证(但不是所有必需的检查)。在光谱的另一端,Xerces和Woodstox检查规范要求的所有内容。Xerces与JDK捆绑在一起;此外,大多数Web服务框架还捆绑了Woodstox。

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