我一直在努力寻找解决方案,通过网络搜索,以及通过许多博客,论坛和网站,我仍然坚持这个问题。
我有这样的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::
...
答案 0 :(得分: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