我有一个Play 2.2应用程序,正在进行WS调用,并想解析响应中返回的HTML。我想寻找一个特定的输入元素并读取存储在其中的值。输入元素仅具有一个名为authenticity_token的名称属性(无ID)。这是代码:
final Promise<WS.Response> loginPagePromise = WS.url("https://www.mysite.com/login").get();
Promise<String> authToken = loginPagePromise.map(
new Function<WS.Response, String>() {
public String apply(WS.Response response) {
Document doc = response.asXml();
NodeList inputElements = doc.getElementsByTagName("input");
for (int i = 0; i < inputElements.getLength(); i++) {
System.out.print("Item "+(i+1));
Node n = inputElements.item(i);
NamedNodeMap m = n.getAttributes();
String inputName = m.getNamedItem("name").getTextContent();
if (inputName.equals("authenticity_token")) {
String token = m.getNamedItem("value").getTextContent();
System.out.print("AUTH TOKEN field value: "+ token);
return token;
}
}
return "";
}
}
);
我在Document doc = response.asXml()行上遇到错误:
[Fatal Error] :5:313: Element type "e.length" must be followed by either attribute specifications, ">" or "/>".
当然,我不是第一个想要做这样的事情的人。知道为什么它不起作用吗?
最佳答案
这不是代码的直接答案,但是您是否考虑过使用NekoHTML代替?
它是一个Java库,完全可以执行您要尝试执行的操作,而没有任何麻烦。