成功解析我的 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());
}