2015-07-23 6 views
0

Вот код:Невозможно преобразовать строку в DOM в Java

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> 

Однако объект стер всегда показывает : Длина символьного потока равна 307, но str равна нулю Объект документа всегда показывает: document = (com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl) [#document: null]

и, следовательно, нет ChildNodes не извлекаемый как это то, что получает выход: [ответ: пустой] на консоли, когда код входит в цикл на г = 0

Что я здесь отсутствует? Я также попытался преобразовать сообщение в поток байтов через ByteArrayInputStream (xml.getBytes()); и передать, что в качестве источника ввода, но получил тот же результат, я думаю, что я не совсем понимаю и не смог найти поиск на форумах.

ответ

0

Это совершенно нормально. Ваш код работает нормально. Вы только смущены toString() вашего элемента. Элемент toString() элемента отобразит имя тега, за которым следует значение узла. Для элементов значение узла равно нулю, поэтому вы получаете [response: null].

замечен в NodeImpl.class:

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

Таким образом, вы получаете свой верхний элемент, response, правильно.

+0

Вы правы, но все Nodes возвращают значение Null по какой-то причине не должны содержать элемент: return open для его значения узла? Я получаю следующее для каждого: Имя узла: текущий \t Значение узла: null Когда я меняю код на NodeList nl = document.getElementsByTagName («текущий»); для (int i = 0; i Tikky

+0

Ok nevermind Мне нужно использовать getTextContent, а не getNodeValue для извлечения значения в элементе node. Немного путаю, но теперь я знаю, что спасибо за быстрый ответ, который я помечаю как правильный. – Tikky

Смежные вопросы