XML:迭代地逐个元素地为每个节点元素GET节点值或文本内容

时间:2015-06-12 04:49:17

标签: java xml dom

这似乎是非常基本的问题。 但我还不清楚它。 这是问题,

我有一个xml的形式:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>storm.starter</groupId>
        <artifactId>storm-starter</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
        <name>storm-starter</name>
        <url>https://github.com/nathanmarz/storm-starter</url>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
        <repositories>
            <repository>
                <id>github-releases</id>
                <url>http://oss.sonatype.org/content/repositories/github-releases/
                </url>
            </repository>
            <repository>
                <id>clojars.org</id>
                <url>http://clojars.org/repo</url>
            </repository>
        </repositories>
    </project>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation=" http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>storm.starter</groupId>
        <artifactId>storm-starter</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
        <name>storm-starter</name>
        <url>https://github.com/nathanmarz/storm-starter</url>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    </project>
</root>

我想逐个打印每个节点的文本内容。 此外,我们假设之前没有标记。 下面是示例代码

public static void anotherMethod(Document doc)
{

//  NodeList nl = doc.getChildNodes();
      NodeList nodeList=doc.getElementsByTagName("*");
        for (int i=0; i<nodeList.getLength(); i++) 
        {
            // Get element
            Element element = (Element)nodeList.item(i);
            System.out.println(element.getNodeName()+" : "+element.getNodeValue());
        }
}

这里的输出如下:

&#13;
&#13;
root : null
project : null
modelVersion : null
groupId : null
artifactId : null
version : null
packaging : null
name : null
url : null
properties : null
project.build.sourceEncoding : null
repositories : null
repository : null
id : null
&#13;
&#13;
&#13;

但我希望输出应该像:

 modelVersion :  4.0.0
 groupId   :   storm.starter
 artifactId   :   storm-starter
 version   :    0.0.1-SNAPSHOT

这里不应该给我没有文字值的节点。

我尝试将getNodevalue()替换为getTextContent(),但这会在该节点内提供所有文本内容,包括属于子节点的内容。

请建议一种方法。

2 个答案:

答案 0 :(得分:0)

您需要使用getTextContent()代替getNodeValue()

NodeList nodeList=doc.getElementsByTagName("*");
for (int i=0; i < nodeList.getLength(); i++) 
{
    Element element = (Element)nodeList.item(i);

    if (element.getChildNodes().getLength() == 0)
        System.out.println(element.getNodeName()+" : "+element.getTextContent());
}

答案 1 :(得分:0)

从@Yeldar给出的提示中获取提示 确切的解决方案是:

getInitialState

它可以打印输出

NodeList nodeList=doc.getElementsByTagName("*");
for (int i=0; i < nodeList.getLength(); i++) 
{
  Node node = nodeList.item(i);
        if (node.getChildNodes().getLength() == 1)
        {
          System.out.println(node.getNodeName()+" : "+node.getFirstChild().getTextContent().trim());
        }
}