java - 当文档以小写 <!doctype 开头时, Karate HTML 解析抛出 SaxException

标签 java html xhtml sax karate

我正在尝试运行一个 Karate 测试,该测试在 URL 上调用 GET,但我发现当网站返回其 <!doctype 时,如果声明为小写(在“正常”HTML 中完全可以接受),我认为 Karate XML 解析器会抛出 fatal error 和警告。在我看来, Karate 使用 XML 解析器,所以严格来说,这可能是小写字母 doctype 的正确行为。会破裂。但是,我无法找到一种方法来解决有效 HTML 的问题。我尝试过不同的标题等,但似乎无法克服这一点。

我做了一个小测试,幸运的是 google.com 也返回小写声明:

示例测试

Given url 'http://www.google.com'
When method GET
Then status 200

错误

[Fatal Error] :1:3: The markup in the document preceding the root element must be well-formed.
15:19:45.267 [main] WARN com.intuit.karate.FileUtils - parsing failed: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 3; The markup in the document preceding the root element must be well-formed.

<!doctype html><html .... blah

我下载了 Karate 源代码并发现了报告的警告:

FileUtils.java

public static String toPrettyString(String raw) {
    raw = StringUtils.trimToEmpty(raw);
    try {
        if (Script.isJson(raw)) {
            return JsonUtils.toPrettyJsonString(JsonUtils.toJsonDoc(raw));
        } else if (Script.isXml(raw)) {
            return XmlUtils.toString(XmlUtils.toXmlDoc(raw), true);
        }
    } catch (Exception e) {
        logger.warn("parsing failed: {}", e.getMessage());
    }
    return raw;
}

通过检查返回文档的第一个字符,似乎是在 JSON 或 XML 之间进行检查:

Script.java

public static final boolean isXml(String text) {
    return text.startsWith("<");
}

XmlUtils.java

那么我相信builder.parse失败,因为它不是有效的 XHTML,因为后面的注释暗示 <!doctype将在递归调用中被删除。

public static Document toXmlDoc(String xml) {
    ...

    Document doc = builder.parse(is);
    if (dtdEntityResolver.dtdPresent) { // DOCTYPE present
        // the XML was not parsed, but I think it hangs at the root as a text node
        // so conversion to string and back has the effect of discarding the DOCTYPE !
        return toXmlDoc(toString(doc, false));

是否可以将此流程转移到有效的 HTML?

最佳答案

如果您查看日志,Karate 还会告诉您它已将完整响应(将在 response 变量中可用)保留为字符串 - 即使它未能“类型转换” ” 将其转换为 XML。顺便说一句,您甚至在 responseBytes 中有一个字节数组。所以现在你可以做任何你想做的事情,例如,理论上你可以找到一个“宽松”的 HTML 解析器并获得 DOM 树或其他东西。

Given url 'http://www.google.com'
When method GET
Then status 200
* print response

一些提示,您可以尝试对响应进行字符串替换,然后尝试将其类型转换为 XML,请参阅:https://github.com/intuit/karate#type-conversion

或者也许您想要做的就是刮掉一些数据,一些正常的正则表达式匹配可能会做,请引用这些:

https://stackoverflow.com/a/53682733/143475

https://stackoverflow.com/a/50372295/143475

关于java - 当文档以小写 &lt;!doctype 开头时, Karate HTML 解析抛出 SaxException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56690306/

相关文章:

java - Java 图形的 2D 可视性( war 迷雾)

java - 尝试在 Activity 目录中执行 LDAP 查找时出错

javascript - GET http ://js:port/socket. io/1/404 未找到

javascript - 剩余时间(倒计时)——Html、Javascript、AngularJS

java - 在 Spring 中使用抽象类作为实例变量

java - 如何访问无状态 session Bean 中的 SFSB

javascript - 如何实现和使用 eyecon 的 bootstrap-datepicker?

java - XPath:如何选择满足某些条件的所有兄弟节点?

asp.net - @font-face 不能在客户网站上工作?

javascript - 我们可以使用任何类型的 javascript 代码作为外部 .js 文件吗?或者有时需要将其放置在 <head> 中?