2016-06-15 2 views
0

Я пытаюсь преобразовать XML String в XML document:Java - разбор строки для вывода XML - #text

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder; 
    try { 
     builder = factory.newDocumentBuilder(); 
     Document document = builder.parse(new InputSource(new StringReader(xmlString))); 
     NodeList firstEle = document.getElementsByTagName("eMail"); 
     for(int i = 0; i < firstEle.getLength();i++){ 
      Node node = firstEle.item(i); //email 
      System.out.println("\ncurrent element : " + node.getNodeName()); //print email 
      NodeList allEmailChilds = node.getChildNodes(); 
      System.out.print("num of child nodes : " + allEmailChilds.getLength());//print 47 
      for(int j = 0 ; j<allEmailChilds.getLength(); j++){ 
       Node inMail = allEmailChilds.item(j);  
       System.out.print("\n"); 
       System.out.print("email element - " + inMail.getNodeName()); //prints #text 

       System.out.print("email value - " + inMail.getTextContent()); //prints empty line 
      } 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Сомон знает, почему это напечатать #text instaed из nodeName? Я не мог найти ответ на этот где-нибудь, вот мой XML:

<?xml version="1.0" encoding="UTF-8"?> 
<eMail> 
    <to>Tove</to> 
    <from>Jani</from> 
    <heading>Reminder</heading> 
    <body>Don't forget me this weekend!</body> 
    //more elemnts..... 
</eMail> 

Кроме того, при попытке получить тип узла:

if(inMail.getNodeType() == Node.ELEMENT_NODE){ 
     System.out.print("ele node"); // never prints 
    } 

Никогда не печатается.

+0

'# text' - это имя узла чистого текста, что обозначает _between_ начальный и конечный тег (« Tove »). Имейте в виду, что между начальным и конечным тегами («Кому») может быть более одного # текста. Обратите внимание, что 'node' может быть передан в' org.w3c.Element', поскольку теги являются тегами. –

+0

ОК, спасибо, я думаю, что объектом элемента является проблема. –

ответ

2

Пожалуйста, смотрите ниже код:

import java.io.StringReader; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 

public class Test 
{ 

    public static void main(String[] args) 
    { 

     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder; 
     try 
     { 
      builder = factory.newDocumentBuilder(); 
      Document document = builder.parse(new InputSource(new StringReader(
        "<eMail><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></eMail> "))); 
      NodeList firstEle = document.getElementsByTagName("eMail"); 
      for (int i = 0; i < firstEle.getLength(); i++) 
      { 
       Node node = firstEle.item(i); // email 
       System.out.println("\ncurrent element : " + node.getNodeName()); // print email 
       NodeList allEmailChilds = node.getChildNodes(); 
       System.out.print("num of child nodes : " + allEmailChilds.getLength());// print 47 
       for (int j = 0; j < allEmailChilds.getLength(); j++) 
       { 
        Node inMail = allEmailChilds.item(j); 
        System.out.print("email element - " + inMail.getNodeName()); // prints #text 

        System.out.print("email value - " + inMail.getTextContent()); // prints empty line 
       } 
      } 

     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

    } 

} 

ВЫВОД:

текущий элемент: Электронная почта Количество дочерних узлов: 4email элемент - toemail значение - Toveemail элемент - fromemail значение - Janiemail элемент - headingemail value - Элемент напоминания - значение bodyemail - Do not Забудьте обо мне в эти выходные!

+0

Да, он работает, я попробовал то же самое. –

+0

Отлично работает, спасибо! –