JAXP и StAX - узел DOM представлен как документ

Я хочу прочитать потенциально большой файл XML. Для эффективности памяти и простоты обработки я хочу использовать смесь StAX и DOM, как описано здесь.

Мой ввод выглядит следующим образом (это OSM)

<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="CGImap 0.0.2">
 <bounds minlat="54.0889580" minlon="12.2487570" maxlat="54.0913900" maxlon="12.2524800"/>
 <node id="298884269" lat="54.0901746" lon="12.2482632" user="SvenHRO" uid="46882" visible="true" version="1" changeset="676636" timestamp="2008-09-21T21:37:45Z"/>
 <node id="261728686" lat="54.0906309" lon="12.2441924" user="PikoWinter" uid="36744" visible="true" version="1" changeset="323878" timestamp="2008-05-03T13:39:23Z"/>
 <node id="1831881213" version="1" changeset="12370172" lat="54.0900666" lon="12.2539381" user="lafkor" uid="75625" visible="true" timestamp="2012-07-20T09:43:19Z">
  <tag k="name" v="Neu Broderstorf"/>
  <tag k="traffic_sign" v="city_limit"/>
 </node>
 ...
 <node id="298884272" lat="54.0901447" lon="12.2516513" user="SvenHRO" uid="46882" visible="true" version="1" changeset="676636" timestamp="2008-09-21T21:37:45Z"/>
 <way id="26659127" user="Masch" uid="55988" visible="true" version="5" changeset="4142606" timestamp="2010-03-16T11:47:08Z">
  <nd ref="292403538"/>
  <nd ref="298884289"/>
  ...
  <nd ref="261728686"/>
  <tag k="highway" v="unclassified"/>
  <tag k="name" v="Pastower Straße"/>
 </way>

Во время обработки я хочу проверить имена узлов, такие как «путь» или «отношение» (как здесь)

Мой код выглядит следующим образом:

    xsr.nextTag();
    while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) {

        DOMResult result = new DOMResult();
        t.transform(new StAXSource(xsr), result);
        Node domNode = result.getNode();

        System.out.println(domNode.getNodeName());
    }

Моя проблема в том, что извлеченные узлы представлены в виде документов, а не узлов. Это означает, что мой вывод отладки показывает:

#документ #документ #документ

для каждой строки. Ожидаемый результат будет "узел", "путь" или "отношение".

Когда я анализирую файл, а затем распечатываю узлы, как описано здесь, они распечатаны правильно.

Я новичок в StAX и DOM, поэтому любые подсказки будут очень полезны.

Я использую Mac OS X 10.10.2 с Java 1.8.25.


person Hendrik Jander    schedule 29.06.2015    source источник


Ответы (2)


Ну, во-первых, у вас путаница в терминологии. Я думаю, когда вы говорите «узел», вы имеете в виду «узел элемента». Документ также является узлом.

Результатом XSLT-преобразования является дерево, а корнем дерева всегда является узел документа (в XSLT 1.0 он называется просто «корневой узел»). Вы найдете узел элемента, который вы ищете, как дочерний элемент документа/корневого узла.

person Michael Kay    schedule 29.06.2015

изменять:

System.out.println(domNode.getNodeName());

to:

System.out.println(((Document)domNode).getDocumentElement().getNodeName());
person Santhosh Kumar Tekuri    schedule 07.07.2015