2015-07-09 2 views
0

Мне нужно проанализировать следующий XML-файл.Java - XML ​​Parser (DOM-Parser)

<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> 

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

В общем я сосредотачиваюсь на ид, тег к = "имя" v = "Эми" и й исх = "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 

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

С наилучшими пожеланиями, Назар

ответ

0

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

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 должен печатать только.

0

Лучший способ поиска и перемещения документов 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

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