本文介紹了當文檔以小寫字母<;!doctype開頭時,空手道HTML解析引發SaxException的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在嘗試運行一個對URL調用GET的空手道測試,但我發現當站點以小寫形式返回<!doctype
聲明(在‘普通’HTML中完全可以接受)時,我認為空手道XML解析器會拋出致命的錯誤和警告。在我看來,空手道使用了一個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
我下載了空手道源代碼,發現報告的警告:
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?
推薦答案
如果您查看日志,空手道還會告訴您,它已經將完整的響應(將在response
變量中可用)保留為字符串–盡管它未能將其”類型轉換”為XML.順便說一下,您甚至在responseBytes
中有一個字節數組。因此,現在由您來做任何您想做的事情,例如,理論上您可以找到一個”寬松”的HTML解析器,然后獲得一棵DOM樹或其他什么東西。
Given url 'http://www.google.com'
When method GET
Then status 200
* print response
有幾個提示,您可以嘗試對response
進行字符串替換,然后嘗試將其類型轉換為XML,請參閱:https://github.com/intuit/karate#type-conversion
或者,您所要做的可能只是收集一些數據,而一些正常的正則表達式匹配可能會做到這一點,請參閱以下內容:
https://stackoverflow.com/a/53682733/143475
https://stackoverflow.com/a/50372295/143475
這篇關于當文檔以小寫字母<;!doctype開頭時,空手道HTML解析引發SaxException的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,