Java:如何在没有递归的情况下获取xml节点路径

时间:2012-06-26 02:16:41

标签: java xml

昨天我问了这个问题,得到了超级Chafouin的大力帮助 Java: How to get xml nodes path

然而。我不能在这里使用递归。有没有办法在没有递归的情况下完成同样的工作? 我真的需要帮助。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

另一条评论看起来很奇怪,因为它一次又一次地复制相同的逻辑。

如果使用DOM,很难不使用递归。但是,还有其他类型的XML解析器。

你的任务很简单,使用StAX解析器(我相信使用SAX同样简单)。

这个想法很简单:

  1. 有一个堆栈来存储当前的“路径”(我称之为路径堆栈)
  2. 遇到节点启动时,将该节点的名称推送到路径堆栈
  3. 遇到节点结束时,从路径堆栈弹出
  4. 遇到文本节点时,打印出路径堆栈中的值和文本值本身
  5. 我认为该指令应该足够清楚,我相信普通程序员应该能够通过上述逻辑找出实际的代码。

答案 1 :(得分:0)

我的看法:

// create a document
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
Document document = domFactory.newDocumentBuilder().parse("input.xml");

// XPath selecting all leaf nodes (assumes all leaf nodes contain a value)
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("//*[count(./descendant::*)=1]");

// list of all nodes containing a value
NodeList list = (NodeList)expr.evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < list.getLength(); i++) {
    // store node name and value
    Node node = list.item(i);
    StringBuilder path = new StringBuilder(node.getNodeName());
    String value = node.getTextContent();

    // traverse all parents and prepend their names to path
    node = node.getParentNode();
    while (node.getNodeType() != Node.DOCUMENT_NODE) {
        path.insert(0, node.getNodeName() + '.');
        node = node.getParentNode();
    }

    System.out.println(path + " = " + value);
}