【发布时间】:2011-09-15 19:35:30
【问题描述】:
我一直在试图弄清楚如何检查 XML 文件的语法,确保所有标签都已关闭,没有随机字符等...我现在只关心确保没有损坏文件中的 XML。
我一直在看一些这样的帖子......
...但我意识到我不想验证 XML 文件的结构;我不想根据 XML Schema (XSD) 进行验证...我只想检查 XML 语法并确定它是否正确。
【问题讨论】:
标签: java xml validation syntax
我一直在试图弄清楚如何检查 XML 文件的语法,确保所有标签都已关闭,没有随机字符等...我现在只关心确保没有损坏文件中的 XML。
我一直在看一些这样的帖子......
...但我意识到我不想验证 XML 文件的结构;我不想根据 XML Schema (XSD) 进行验证...我只想检查 XML 语法并确定它是否正确。
【问题讨论】:
标签: java xml validation syntax
您可以使用以下代码检查 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());
}
}
这来自this website,它提供了各种使用Java 验证XML 的方法。另请注意,此方法将整个 DOM 树加载到内存中,如果您想保存在 RAM 上,请参阅 cmets 了解替代方案。
【讨论】:
您要问的是如何验证一段内容是否是格式良好的 XML 文档。这很容易通过简单地让 XML 解析器(尝试)解析有问题的内容来完成——如果有问题,解析器将通过抛出异常来报告错误。真的没有更多的东西了。所以你只需要弄清楚如何解析 XML 文档。
唯一需要注意的是,一些声称是 XML 解析器的库并不是真正合适的解析器,因为它们实际上可能无法验证 XML 解析器必须做的事情(根据 XML 规范)——在 Java 中,Javolution是一个几乎没有检查的例子; VTD-XML 和 XPP3 进行一些验证(但不是所有必需的检查)。另一方面,Xerces 和 Woodstox 会检查规范要求的所有内容。 Xerces 与 JDK 捆绑在一起;并且大多数 Web 服务框架还捆绑了 Woodstox。
由于接受的答案已经显示了如何将内容解析为 DOM 文档(从解析开始),这可能就足够了。
唯一需要注意的是,这要求您的可用内存是输入文档原始大小的 3-5 倍。要解决此限制,您可以使用流解析器,例如 Woodstox(它实现标准 Stax API)。如果是这样,您将创建一个 XMLStreamReader,只要 reader.hasNext() 返回 true,就调用 reader.next()。
【讨论】:
http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html 这有帮助吗?它使用非常强大的 XSD。您不仅可以验证文档结构,还可以提供一些非常复杂的规则来确定节点和属性可以包含的内容类型。
【讨论】: