java中的XMLParser

时间:2013-05-14 12:19:27

标签: 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());
    }
}

请帮我解决这个问题。谢谢你的到来。

4 个答案:

答案 0 :(得分:3)

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

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

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

注意,如果你得到一个元素的Value(),那就是所有后代的连接字符串,包括空格。

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

答案 1 :(得分:1)

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

if(dataNode instanceof Element) {
    String tag = ((Element)dataNode).getTagName();
}

答案 2 :(得分:0)

尝试删除文本节点。

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

条件dataNode.getNodeType()== Node.ELEMENT_NODE将删除所有非元素节点。

答案 3 :(得分: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());
                   }
                   */
            }
        }