выбрать узлы из набора узлов

У меня есть большой файл XML, который я анализирую.

Мой первый оператор selectNodes дает мне список всех элементов, которые я хочу проанализировать.

Для каждого элемента, возвращаемого первым оператором selectNodes, я хочу запустить еще один selectNodes.

XML может выглядеть так:

<A>
    <B></B>
    <C></C>
</A>
<A>
    <B></B>
    <C></C>
</A>

Я ограничен, потому что я должен анализировать внутренние узлы, то есть каждое подмножество «А», по одному.

Конечная цель состоит в том, чтобы сделать что-то с каждой комбинацией B, C, по одной за раз.


person Rubber Duck    schedule 08.08.2012    source источник


Ответы (2)


В xPath вы можете использовать двойную косую черту (//), чтобы найти все узлы с определенным именем в родительском узле. Если вы хотите вернуть все узлы в документе, ваше выражение может начинаться с «//».

Чтобы вернуть все узлы B и все узлы C в отдельные списки, попробуйте:

List<?> bNodes = document.selectNodes("//B");
List<?> cNodes = document.selectNodes("//C");

for (Object b : bNodes)
  for (Object c : cNodes)
    //do something with each b/c combination

В качестве альтернативы, чтобы указать корневой узел для поиска, используйте:

List<?> bNodes = document.selectNodes("A//B");
List<?> cNodes = document.selectNodes("A//C");

Где document — ваш файл, прочитанный с помощью SAXReader.

person 17slim    schedule 21.08.2015

Вы можете указать любой узел, который хотите, в качестве контекста выражения XPath. Допустим, у вас есть выражение XPath для выбора узла B:

XPathExpression expr = xpath.compile("./B");

Предположим, у вас есть узел A в переменной Node aNode. Вы можете выбрать элемент B, используя просто

Object result = expr.evaluate(aNode, XPathConstants.NODE);

Где результат будет типа Node.

person Tassos Bassoukos    schedule 08.08.2012