0

我正在尝试使用XMLUnit 2.2.0 比较两个 XHTML 文档。但是,它需要的时间太长。我猜图书馆正在从 Internet 下载 DTD 文件。

如何禁用 DTD 验证?我正在使用以下测试代码:

public class Main {
    public static void main(String args[]) {
        Diff d = DiffBuilder.compare(
                Input.fromString(
                     "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \n"
                    +"     \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
                    +"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
                    +"     <head></head>\n"
                    +"     <body>some content 1</body>\n"
                    +"</html>")).withTest(
                Input.fromString(                   
                     "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \n"
                    +"     \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
                    +"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
                    +"     <head></head>\n"
                    +"     <body>some content 2</body>\n"
                    +"</html>")).ignoreWhitespace().build();
        if(d.hasDifferences()) 
            for (Difference dd: d.getDifferences()) {
                System.out.println(dd.toString());
            }
    }
}

阅读XMLUnit JavadocDiffBuilder.withDocumentBuilderFactory()我想我可以像这样设置一个文档构建器工厂...

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

dbf.setValidating(false);
dbf.setFeature("http://xml.org/sax/features/validation", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

Diff d = DiffBuilder.compare(Input.fromString(...)).withTest(
     Input.fromString(...)).withDocumentBuilderFactory(dbf)
          .ignoreWhitespace().build();

那没起效。就在我从 XHTML 片段中删除 DOCTYPE 定义时,我的代码运行得很快。

4

1 回答 1

1

withDocumentBuilderFactory正是您想要使用的,但不幸的是ignoreWhitespace失败了。

在幕后DiffBuilder创建一个不使用您配置的WhitespaceStrippedSource创建 DOM 。这是一个错误。你想为此创建一个问题吗?DocumentDocumentBuilderFactory

使用 XMLUnit 2.2.0 的解决方法是Document自己创建 s,类似于

Document control = Convert.toDocument(Input.fromString(...).build(), dbf);
Document test = ...
Diff d = DiffBuilder.compare(Input.fromDocument(control))
             .withTest(Input.fromDocument(test))
             .ignoreWhitespace().build();

编辑:该错误已在 XMLUnit 2.2.1 中修复,问题的代码现在应该可以正常工作而无需任何更改。

于 2016-06-18T17:02:13.533 回答