2013-04-02 4 views
0

Я пытался найти решение, искать в Интернете и через многие блоги, форумы и веб-сайты, и я все еще придерживаюсь этой проблемы.XML-рекурсивный узел Parser

У меня есть источник XML, как это:

<?xml version="1.0" encoding="UTF-8" ?> 
<root> 
    <level_one> 
     <level_two> 
     #text 
     </level_two> 
     <level_two> 
     #text 
     </level_two> 
    </level_one> 
</root> 

Затем в Java Я пытаюсь разобрать этот XML-файл рекурсивным образом. Это моя функция:

public void parseXML(Node root, Node parent) 
{ 
    if (root.hasChildNodes()) 
    { 
     NodeList childrens = root.getChildNodes(); 
     for (int i = 0; childrens.getLength(); i++) 
     { 
      parseXML(childrens.item(i), root);   
     }//for 
    }//fi:root_childrens 
    else 
     System.println.out(parent.getNodeName()+"::"+root.getNodeValue()); 
} 

Однажды, когда я загрузил файл XML, я:

xmlDoc.normalize(); 
parseXML(xmlDoc.getFirstChild(), null); 

ОК, это работает ... более или менее. Теперь ответ я получаю следующее:

root:: //OK 
level_one:: //OK 
level_two::#text //OK 
level_one:: //WRONG: should not appear any more 
level_two::#text //OK 
level_one:: //WRONG: should not appear any more 
root:: //WRONG: should not appear any more 

Я использую следующие библиотеки:

import javax.xml.*; 
import org.w3c.dom.*; 

Спасибо за вашу помощь.

EDIT 1: FYI. Файлы XML идут глубже, чем 2 уровня.

EDIT 2: Если изменить parent.getNodeName() к root.getNodeName(), я получаю следующий ответ:

#text:: 
#text:: 
#text:: 
... 
+0

жаль, что это моя ошибка. –

ответ

2

Это потому, что ваша программа отображает пустые текстовые узлы который содержит пробелы, как: "\ п"

Ваш XML можно рассматривать следующим образом:

<?xml version="1.0" encoding="UTF-8" ?> 
<root>[A node that contains "\n "] 
    <level_one>[A node that contains "\n "] 
     <level_two> 
     #text 
     </level_two> 
     <level_two> 
     #text 
     </level_two>[A node that contains "\n "] 
    </level_one>[A node that contains "\n "] 
</root> 

Именно поэтому узлы отображаются дважды.

Для получает свой желаемый результат, вы можете написать что-то вроде этого:

public static void parseXML(Node node, Node parent) 
{ 
    if (node.hasChildNodes()) 
    { 
     System.out.println(node.getNodeName()); 
     NodeList childrens = node.getChildNodes(); 
     for (int i = 0; i < childrens.getLength(); i++) 
     { 
      parseXML(childrens.item(i), node);   
     }//for 
    }//fi:root_childrens 
    else { 
     String nodeValue = node.getNodeValue().trim(); 
     if (nodeValue.length() > 0){ 
      System.out.println(parent.getNodeName() + "::" + nodeValue); 
     } 

    } 
} 

Что будет печатать:

#document 
root 
level_one 
level_two 
level_two::#text 
level_two 
level_two::#text 
+0

Да, есть проблема. После того, как я очистил XML-файл с специальных символов «\ n» или «\ t», код работает! Спасибо за вашу помощь. – Wolfchamane