【问题标题】:XMLParser in javajava中的XML解析器
【发布时间】:2013-05-14 12:19:26
【问题描述】:

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

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

【问题讨论】:

    标签: java xml xml-parsing


    【解决方案1】:

    在 XML 中,几乎所有东西都是一个节点,所有节点都实现getNodeName()(或每个解析器中的类似语法)。元素和属性是节点并具有明确的节点名称(elementName(在您的情况下为"test", "a", "b", "c", "files", "file")或attributeName(您没有属性))。 text() 节点和 comment() 节点没有单独的节点名称。解析器通常会为它们提供#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"

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        尝试删除文本节点。

            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 将删除所有非元素节点。

        【讨论】:

          【解决方案4】:
                      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());
                             }
                             */
                      }
                  }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-29
            • 2012-03-23
            相关资源
            最近更新 更多