Java — парсер XML (DOM-парсер)

Мне нужно разобрать следующий файл xml.

<way id="50139553">
   <nd ref="637270182"/>
   <nd ref="637270196"/>
   <tag k="name" v="Amy"/>
   <tag k="bench" v="yes"/>
   <tag k="bin" v="yes"/>
   <tag k="public_transport" v="platform"/>
   <tag k="railway" v="platform"/>
   <tag k="shelter" v="yes"/>
   <tag k="tactile_paving" v="yes"/>
   <tag k="wheelchair" v="yes"/>
</way>

Я хочу выбрать только несколько значений: 50139553,Эми, 637270182 и 637270196.

Обычно я фокусируюсь на id, tag k="name" v="Amy" и nd ref="637270182".

Это код Java, который я использовал:

Way _way = new Way();
    for (int zl = 0; zl < wayList.getLength(); zl++) {                

        Node way = wayList.item(zl);

        if (way.hasAttributes()) {
            String id = way.getAttributes().getNamedItem("id").getNodeValue();
            _way.id = id;
        }

        for(int k = 0; k  < way.getChildNodes().getLength();++k) {

            Node childNode = way.getChildNodes().item(k);

            if (childNode.getNodeType() == Node.ELEMENT_NODE) {

                Element fin = (Element) childNode;                      

                if(fin.getAttribute("k").contains("name")) {
                    _way.name = fin.getAttribute("v");
                } 


                if(_way.name == null) {             
                    waysOhneNamenIDList.add(_way.id);
                } 


                System.out.println("Way-Id: " + _way.id + " Way-Name: " + _way.name + " Way-Ref: " + _way.ref);

                _way.ref = fin.getAttribute("ref");



            } 
        }
    }

Консоль показывает мне следующий вывод:

Way-Id: 50139553 Way-Name: null Way-Ref: null
Way-Id: 50139553 Way-Name: null Way-Ref: 637270182
Way-Id: 50139553 Way-Name: Amy Way-Ref: 637270196
Way-Id: 50139553 Way-Name: Amy Way-Ref: 
Way-Id: 50139553 Way-Name: Amy Way-Ref: 
Way-Id: 50139553 Way-Name: Amy Way-Ref: 
Way-Id: 50139553 Way-Name: Amy Way-Ref: 
Way-Id: 50139553 Way-Name: Amy Way-Ref: 
Way-Id: 50139553 Way-Name: Amy Way-Ref: 
Way-Id: 50139553 Way-Name: Amy Way-Ref: 

Но я хочу, чтобы это было так:

Way-Id: 50139553 Way-Name: Amy Way-Ref: 637270182
Way-Id: 50139553 Way-Name: Amy Way-Ref: 637270196

Так что я могу сделать?

С уважением, Назар.


person Nazar Medeiros    schedule 09.07.2015    source источник


Ответы (2)


Проверка условий (по ссылке и имени значения объекта пути) при печати, как показано ниже, должна вам помочь!

if (_way.name != null && !_way.name.trim().isEmpty() && (_way.ref != null && !_way.ref.trim().isEmpty()) {
   System.out.println("Way-Id: " + _way.id + " Way-Name: " + _way.name + " Way-Ref: " + _way.ref);
}

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

person sakthisundar    schedule 09.07.2015

Лучший способ поиска и просмотра документов XML DOM — это Xpath.
Вот фрагмент кода, который извлекает все, что вам нужно. Я добавил комментарии столько, сколько я считал нужным

import javax.xml.parsers.*;
import org.w3c.dom.*;

String wayNodePattern = "//way";                // search all way tags in the document
String wayIdPattern = "./@id";                  // retrieve id attribute of current node
String wayNamePattern = "./tag[@k='name']/@v";  // retrieve v attribute of tag node under current node where k attribute is "name"
String wayRefPattern = "./nd/@ref";             // retrieve ref attribute of nd node under current node

XPath xPath =  XPathFactory.newInstance().newXPath();
Document doc = ...
NodeList wayList = (NodeList)xPath.compile(wayNodePattern)
        .evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < wayList.getLength() ; i++) {
    Node way = wayList.item(i);
    String wayId = (String)xPath.compile(wayIdPattern).evaluate(way, XPathConstants.STRING);
    String wayName = (String)xPath.compile(wayNamePattern).evaluate(way, XPathConstants.STRING);
    NodeList wayRefList = (NodeList)xPath.compile(wayRefPattern).evaluate(way, XPathConstants.NODESET);
    System.out.print("Way-Id:" + wayId + " Way-Name:" + wayName);
    for (int j = 0; j < wayRefList.getLength() ; j++) {
        Node wayRef = wayRefList.item(j);
        System.out.print(" Way-Ref:" + wayRef.getNodeValue());
    }
    System.out.println();
}

Выход:

Way-Id:50139553 Way-Name:Amy Way-Ref:637270182 Way-Ref:637270196

person Sharon Ben Asher    schedule 09.07.2015