java - java 中的 XMLParser

标签 java xml xml-parsing

使用 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());
    }
}

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

最佳答案

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

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

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

请注意,如果您对某个元素进行 getValue(),则该元素是所有后代的串联字符串,包括空格。

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

关于java - java 中的 XMLParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16542974/

相关文章:

java - BerkeleyDB JE 随机访问时间非线性增加

java - 在java中打开源文件中的文件docx

JAVA DOM XML 解析

xml - 在 AS3 中使用 insertChildBefore 和 insertChildAfter 时遇到问题

c - 如何使用 libxml2 库在 c 中解析 XML 字符串而不是 XML 文档

java - 尝试用 Java 解析 org.w3c.dom.Document XML 文档

java - MD5 和 Hibernate 查询

java - 使用 Java 更改 xml-node 的节点名称

javascript - 如何使用 xml2js(而不是使用下划线键)访​​问 XML 元素文本?

java - 如何使用 VTD-XML 解析器删除特定节点