-1

我一直在尝试寻找解决方案,通过网络以及许多博客、论坛和网站进行搜索,但我仍然被这个问题所困扰。

我有一个这样的 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.*;

谢谢你的帮助。

编辑1:仅供参考。XML 文件的深度超过 2 个级别。

编辑 2:如果我将parent.getNodeName()更改为root.getNodeName(),我会得到以下响应:

#text::
#text::
#text::
...
4

1 回答 1

2

这是因为您的程序正在显示包含空格的空文本节点,例如:“\n”

您的 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
于 2013-04-02T09:02:44.047 回答