2

使用 getNodeName 时,它​​将返回带有“#text”作为前缀的实际值。我不想要那个前缀。如果我删除空格和换行符,getNodeName 工作正常。我正在使用 DocumentBuilderFactory、DocumentBuilder 和 Document 来解析 xml。

我的 XML 文件

<test>
    <a>
        file1
    </a>
    <b>
        file2
    </b>
    <c>
        <files>
            <file>
                myfile1
            </file>
        </files>
    </c>
</test>

我的java方法

NodeList childNodes = null;
NodeList parentNodes = xml.getNodeList("test");
int node_len = parentNodes.getLength();
for (int i = 0; i < node_len; i++)
{
    childNodes = parentNodes.item(i).getChildNodes();
    int child_len = childNodes.getLength();
    for (int j = 0; j < child_len; j++)
    {
        Node dataNode = childNodes.item(j);
        System.out.println(dataNode.getNodeName());
    }
}

请帮我解决这个问题。谢谢是提前。

4

4 回答 4

3

在 XML 中,几乎所有东西都是一个节点,并且所有节点都实现getNodeName()(或每个解析器中的类似语法)。元素和属性是节点并具有明确的节点名称(elementName(在您的情况下"test", "a", "b", "c", "files", "file")或attributeName(您没有属性))。text()节点 和 和comment()节点没有单独的节点名称。解析器通常会给它们一个共同的 nodeName#text#comment,这样你就可以看到它们是什么类型。(唯一的其他合乎逻辑的选择是 null 或 emptyString 或 throw Exception 所有这些都会更糟。)

"While using getNodeName, it will return actual value with "#text" as prefix". 你确定吗?

确保您没有将节点的名称与其值混淆。有两个单独的操作: getNodeName()应该"#text"为所有文本节点返回。getValue()应该返回"myfile1"(可能带有尾随\n)。请注意,您的文件包含许多空白文本节点。

请注意,如果您 getValue() 一个元素,那是所有后代的串联字符串,包括空格。

另请注意,该字符串"myfile1"不是 elementNode 文件的子项。elementNode 有一个子text()节点,其字符串值为"myfile1"

于 2013-05-14T12:24:31.657 回答
1

除了@peter.murray.rust 给出的答案,我想建议您检查该节点是否实际Element(在您的情况下是预期的),转换为Element并调用getTagName()

if(dataNode instanceof Element) {
    String tag = ((Element)dataNode).getTagName();
}
于 2013-05-14T12:31:09.390 回答
0

Try to drop text nodes.

    for (int j = 0; j < child_len; j++)
    {
        Node dataNode = childNodes.item(j);
        if (dataNode.getNodeType() == Node.ELEMENT_NODE) {
                System.out.println(dataNode.getNodeName());
        }
    }

The condition dataNode.getNodeType() == Node.ELEMENT_NODE will drop all non-element nodes.

于 2013-05-14T12:33:58.460 回答
0
            for (int j = 0; j < child_len; j++)
            {
                Node dataNode = childNodes.item(j);

                    if(dataNode.getAttributes() != null)
                        System.out.println(dataNode.getNodeName());

                   /*or
                   if (dataNode.getNodeType() == Node.ELEMENT_NODE) 
                   {
                       System.out.println(dataNode.getNodeName());
                   }
                   */
            }
        }
于 2013-05-14T12:37:28.223 回答