所以我设法使用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());
}
感谢您提供任何帮助。
答案 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());
}