以下是代码:
Response resp = tkMarC.getClock(TK_Base.Format.xml);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
String xml = resp.getBody();
System.out.println(xml);
StringReader sr = new StringReader(xml);
InputSource is = new InputSource(sr);
try {
DocumentBuilder db = dbf.newDocumentBuilder();
Document docu = db.parse(is);
if (docu != null)
{
NodeList nl = docu.getChildNodes();
for(int i=0; i<nl.getLength(); i++)
{
System.out.println(nl.item(i).toString());
}
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
这是System.out.println(xml)
的输出<?xml version="1.0" encoding="UTF-8"?>
<response id="-5b6df009:14ebc2afaf9:-3779">
<date>2015-07-23 14:30:25.134000</date>
<status>
<current>open</current>
<next>after</next>
<change_at>16:00:00</change_at>
</status>
<message>Market is open</message>
<unixtime>1437676225</unixtime>
</response>
然而 sr对象总是显示: characterstream的长度为307,但str为null docu对象总是显示: docu =(com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl)[#document:null]
因此没有可检索的ChildNodes,因为这是输出的内容: 代码在i = 0
上进入for循环时,控制台上的[response:null]我在这里缺少什么?我还尝试通过ByteArrayInputStream(xml.getBytes())将消息转换为字节流;并将其作为输入源传递,但得到相同的结果有一些我猜我不太掌握,无法找到搜索论坛。
答案 0 :(得分:0)
这是完全正常的。你的代码运行正常。你只对元素的toString()
感到困惑。元素的toString()
将显示标记名称,后跟节点值。对于元素,节点值为null,因此您得到[response: null]
。
在NodeImpl.class中看到:
/** NON-DOM method for debugging convenience. */
public String toString() {
return "["+getNodeName()+": "+getNodeValue()+"]";
}
所以你正确地得到了你的顶级元素response
。