0

所以我已经成功地使用 SAX 解析了我的 XML 文档,现在我正在尝试使用 DOM 解析 XML 文档(结果与使用 SAX 获得的输出相同)。

我已经设法编辑了大部分 SAX 代码以在 DOM 中工作。

例如,在我使用的开始和结束元素中使用 SAX:

if (qName.equals("Name")){...}

在 Node.ELEMENT_NODE 的情况下使用 DOM 我刚刚将其编辑为:

String name = node.getNodeName();
if (name.equals("Name")){...}

我坚持的部分是如何使用 DOM 以类似的方式解析 SAX 中的所有 endElement?

我设法使用以下方法打印所有文本:

 case Node.TEXT_NODE:

    System.out.print(node.getNodeValue().trim());

但是我将如何在特定的文本节点之后打印一些东西?在 SAX 中,这可以在 endElement 中轻松完成。

我一直在尝试使用它从名称元素内部打印文本,但它不起作用。

case Node.TEXT_NODE:

if (node.getNodeName().equals("name")) {
      System.out.print(node.getNodeValue().trim());
    }

感谢您对此的任何帮助。

4

3 回答 3

0

您是否尝试过递归方法?

public void visitNode(Node node) {
   // Print something emulating a start tag

   // Visit all child nodes recursively
   for (int i = 0; i < node.getChildNodes().getLength(); i++)
     visitNode(node.getChildeNodes().item(i));

   // Print something emulating an end tag
}
于 2012-04-21T16:23:14.477 回答
0

如果您知道所需的节点,另一种方法是使用xpath。该设置可能看起来势不可挡,但它非常强大。

String xpath="//name";
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile(xpathStatement);
NodeList nodes = (NodeList) expr.evaluate(source, XPathConstants.NODESET);
for (int i=0; i<nodes.getLength(); i++) {
    Node node = nodes.item(i);
    System.out.println(node.getNodeValue());
}
于 2012-04-21T16:45:52.453 回答
0

查看Nodejavadoc - 它有一个固定的名称"#text";您需要检查父级的名称,即标签:

case Node.TEXT_NODE:

if (node.getParentNode().getNodeName().equals("Name")) {
  System.out.print(node.getNodeValue().trim());
}
于 2012-04-21T20:51:52.767 回答