1

我昨天问了这个问题,并从 Super Chafouin Java 那里得到了很大的帮助:如何获取 xml 节点路径

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

4

2 回答 2

2

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

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

使用 StAX 解析器可以直接完成您的任务(我相信使用 SAX 同样简单)。

这个想法很简单:

  1. 有一个堆栈来存储当前的“路径”(让我称之为路径堆栈)
  2. 当您遇到节点开始时,将该节点的名称推送到路径堆栈
  3. 当你遇到节点结束时,从路径堆栈中弹出
  4. 当遇到文本节点时,打印出路径栈中的值,以及文本值本身

我相信指令应该足够清晰,并且我相信普通程序员应该能够通过上述逻辑找出实际代码。

于 2012-06-26T03:02:47.817 回答
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);
}
于 2012-06-26T03:47:00.417 回答