无法在Java中将String转换为DOM

时间:2015-07-23 18:57:57

标签: java dom response scribe

以下是代码:

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())将消息转换为字节流;并将其作为输入源传递,但得到相同的结果有一些我猜我不太掌握,无法找到搜索论坛。

1 个答案:

答案 0 :(得分:0)

这是完全正常的。你的代码运行正常。你只对元素的toString()感到困惑。元素的toString()将显示标记名称,后跟节点值。对于元素,节点值为null,因此您得到[response: null]

在NodeImpl.class中看到:

/** NON-DOM method for debugging convenience. */
public String toString() {
    return "["+getNodeName()+": "+getNodeValue()+"]";
}

所以你正确地得到了你的顶级元素response