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

Posted

技术标签:

【中文标题】Java中的XML语法验证[关闭]【英文标题】:XML syntax validation in Java [closed] 【发布时间】:2011-09-15 19:35:30 【问题描述】:

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

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

Validate an XML file against local DTD file with Java

What's the best way to validate an XML file against an XSD file?

...但我意识到我不想验证 XML 文件的结构;我不想根据 XML Schema (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());
    

这来自this website,它提供了各种使用Java 验证XML 的方法。另请注意,此方法将整个 DOM 树加载到内存中,如果您想保存在 RAM 上,请参阅 cmets 了解替代方案。

【讨论】:

那么这会检查 XML 文件的 语法 吗?我不想在这里使用 XML Schema... 是的,它将检查文档是否遵循 XML 规范 - w3.org/TR/xml/#sec-well-formed 规定的“格式正确”规则。这意味着所有元素都必须关闭、正确嵌套等。事实上,规范定义了格式良好,因为您不能总是使用 DTD。 但是 sax 不是更好的选择,就性能而言,他没有使用该文档,因此不需要将其保存在内存中 是的,可能。也就是说,如果他实际上不需要内存中的文档——我认为他并不是真的暗示了这一点。在这种情况下,这里有示例代码可以使用 SAX 执行完全相同的操作:edankert.com/validate.html 没问题。我在回答中给你的方法使用 DOM 来解析文档,它会在运行过程中构建文档树,可能会占用大量内存。 SAX 不会构建文档树。你可以在这里找到两者的一个很好的比较:developerlife.com/tutorials/?p=28【参考方案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,只要 reader.hasNext() 返回 true,就调用 reader.next()

【讨论】:

【参考方案3】:

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html 这有帮助吗?它使用非常强大的 XSD。您不仅可以验证文档结构,还可以提供一些非常复杂的规则来确定节点和属性可以包含的内容类型。

【讨论】:

我不想使用 XSD...我正在其他地方处理这种验证。我现在只想检查语法。 您介意告诉我使用 XSD 有什么问题吗?你不想写 XSD 吗?您如何知道您的文档要符合哪个版本的 xml? 没问题...已经有代码可以针对 XSD 进行验证。但它不检查语法。 如果您要针对 XSD 验证您的 XML,并且它的格式不正确,您的验证是否没有发现? 我不这么认为...不是我写的 :) 可能,但它很可能无法处理可能出现的特定语法问题。

以上是关于Java中的XML语法验证[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用DTD验证XML

XML验证

java - 如何将本地DTD文件的验证应用于java中的xml文件?

使用 Java 中的 Xerces 针对 XSD 1.1 进行 XML 验证

如何关闭eclipse对js xml的验证?

如何关闭eclipse对js xml的验证