Получить узлы XML с определенного уровня дерева - PullRequest
4 голосов
/ 03 марта 2011

Мне нужен метод, подобный Document.getElementsByTagName (), но такой, который ищет только теги определенного уровня (т. Е. Не вложенные теги с одинаковыми именами)

Файл примера:

<script>
  <something>
    <findme></findme><!-- DO NOT FIND THIS TAG -->
  </something>
  <findme></findme><!-- FIND THIS TAG -->
</script>

Document.getElementsByTagName () просто возвращает все теги findme в документе.

Ответы [ 3 ]

5 голосов
/ 03 марта 2011

Вот пример с XPath

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class TestXPath {

    private static final String FILE = "a.xml" ;
    private static final String XPATH = "/script/findme";
    public static void main(String[] args) {

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        docFactory.setNamespaceAware(true);
        DocumentBuilder builder;
        try {
            builder = docFactory.newDocumentBuilder();
            Document doc = builder.parse(FILE);
            XPathExpression expr = XPathFactory.newInstance().newXPath().compile(XPATH);
            Object hits = expr.evaluate(doc, XPathConstants.NODESET ) ;
            if ( hits instanceof NodeList ) {
                NodeList list = (NodeList) hits ;
                for (int i = 0; i < list.getLength(); i++ ) {
                    System.out.println( list.item(i).getTextContent() );
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

С

<script>
  <something>
    <findme>1</findme><!-- DO NOT FIND THIS TAG -->
  </something>
  <findme>Find this</findme><!-- FIND THIS TAG -->
  <findme>More of this</findme><!-- FIND THIS TAG AS WELL -->
</script>

Это дает

Find this
More of this
1 голос
/ 03 марта 2011

Если вы используете DOM, я могу думать только о рекурсивной функции, которая просматривает дочерние элементы каждого элемента.

0 голосов
/ 05 марта 2011

Использование:

/*/findme

Это выражение XPath выбирает все элементы findme, являющиеся дочерними элементами верхнего элемента документа XML.

Это выражение :

//findme[count(ancestor::*) = 5]

выбирает все элементы findme в документе XML, которые имеют ровно пять элементов-предков - то есть все они находятся на "уровне 6".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...