2012-06-26 2 views
1

Я задал этот вопрос вчера и получил большую помощь от Супер Chafouin Java: How to get xml nodes pathJava: Как получить XML-узлов путь без рекурсии

Однако. Здесь я не могу использовать рекурсию. Есть ли способ выполнить ту же работу без рекурсии? Мне очень нужна помощь с этим. Спасибо заранее.

+1

Вы, конечно, можете преобразовать рекурсивное решение для обхвата раствора с Stack. – nhahtdh

+1

Это не отвечает на ваш вопрос, но почему вы не можете использовать рекурсию? Какое ограничение требует от вас, если по-другому? –

+0

Я не очень опытный, не могли бы вы помочь мне с примером? – klipa

ответ

2

Другой комментарий выглядит так странно для меня, поскольку он копирует ту же логику снова и снова.

Трудно не использовать рекурсию, если вы используете DOM. Однако существует и другой вид анализатора XML.

Ваша задача прямолинейна с помощью анализатора StAX (я считаю, что использование SAX одинаково прост).

Идея проста:

  1. Есть стек для хранения текущего «пути» (Позволь мне называть его стек путем)
  2. Когда вы сталкиваетесь с началом узла, нажмите имя этого узла стек путь
  3. Когда вы сталкиваетесь конец узла, поп из стека пути
  4. При обнаружении текстового узла, распечатайте значения в стеке пути, и текстовое значение само

Я считаю, что инструкция должна быть достаточно ясной, и я считаю, что средний программист должен уметь вычислять фактический код по описанной выше логике.

+0

Я никогда не использовал синтаксический анализатор StAX, не могли бы вы привести пример, подходящий для моего случая? – klipa

+1

Вы когда-нибудь пробовали это самостоятельно? Я считаю, что намеки достаточно ясны. Что делает это настолько трудным для вас, просто наберите «пример синтаксического анализа xml xml» в google? –

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); 
} 
+1

Slanec благодарит много. Просто проверил ваш код, и он отлично работает. – klipa

+0

@klipa Я рад, что смог помочь. Если у вас возникли дополнительные вопросы по поводу кода, уберите его! –

+0

Единственные вещи - на самом деле мне нужен путь и значение узлов в отдельных полях, чтобы вставить их в базу данных. И я не совсем уверен, как получить к ним доступ из строки строки за строкой, как это было в моем вчерашнем сообщении, где они были сохранены в ArrayList в {tagPath, value} pare. – klipa

Смежные вопросы