需要一些帮助从 SAX 迁移到 DOM. 解析 XML (java)


所以我设法使用 SAX

成功解析我的 XML 文档,现在我正在尝试使用 DOM 解析 XML 文档(结果与使用 SAX 实现的输出相同)。

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

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

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

并使用 DOM,以防万一Node.ELEMENT_NODE我刚刚将其编辑为:

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

感谢您对此的任何帮助。

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

case Node.TEXT_NODE:
if (node.getParentNode().getNodeName().equals("Name")) {
  System.out.print(node.getNodeValue().trim());
}

你试过递归方法吗?

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
}

如果您知道所需的节点,另一种方法是使用 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());
}

最新更新