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

时间:2012-04-21 15:45:10

标签: java parsing dom sax

所以我设法使用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());
    }

感谢您提供任何帮助。

3 个答案:

答案 0 :(得分: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
}

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

答案 2 :(得分:0)

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

case Node.TEXT_NODE:

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