2013-11-26 6 views
0

Я пытаюсь извлечь информацию «ref» для каждого «nd» под элементом «way». Я попытался использовать обычный Java-анализатор xml и XPath, но до сих пор не могу понять, как получить несколько дочерних узлов.Извлечь атрибут элемента из XML

<?xml version='1.0' encoding='UTF-8'?> 
<osm version="0.6" generator="Osmosis 0.43.1"> 
    <node id="95946773" version="3" timestamp="2009-11-14T15:52:46Z" uid="17427" user="dysteleologist" changeset="3114170" lat="26.2870135" lon="-80.2120936"/> 
    <node id="95946776" version="3" timestamp="2010-10-23T15:07:03Z" uid="207745" user="NE2" changeset="6146275" lat="26.2870058" lon="-80.2128489"/> 
<way id="226137459" version="1" timestamp="2013-06-17T20:19:27Z" uid="1119200" user="wagn" changeset="16595491"> 
    <nd ref="2349898722"/> 
    <nd ref="2349898723"/> 
    <nd ref="2349898724"/> 
    <nd ref="2349898725"/> 
    <nd ref="2349898726"/> 
    <nd ref="2349898730"/> 
    <nd ref="2349898727"/> 
    <nd ref="2349898728"/> 
    <nd ref="2349898729"/> 
    <nd ref="2349898722"/> 
    <tag k="building" v="house"/> 
    </way> 
</osm> 

Мой код для извлечения элемента «путь».

NodeList wList = doc.getElementsByTagName("way"); 
for (int temp = 0; temp < wList.getLength(); temp++) { 

    Node wNode = wList.item(temp); 

    if (wNode.getNodeType() == Node.ELEMENT_NODE) { 
     Element wElement = (Element) wNode; 

     output_str = ""; 
     output_str += wElement.getAttribute("id")+ " "; 
         System.out.println(wElement.getElementsByTagName("nd").item(0).getAttribute("ref")); 

Это изменить последнюю печать линию ниже

System.out.println(wElement.getElementsByTagName("nd").item(0).getNodeName()); 

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

В javascript он работает, как показано ниже, но этот синтаксис не работает на Java.

System.out.println(wElement.getElementsByTagName("nd")[0].getAttribute("ref")); 

Спасибо,

Тони

+1

пытается с помощью контекста JAXB Маршаллу и маршализацию –

+0

Extract как? Покажите код Java, который вы пробовали до сих пор. –

ответ

0

этот синтаксис не работает в Java.

System.out.println(wElement.getElementsByTagName("nd")[0].getAttribute("ref")); 

Есть две вещи, которые нужно изменить там. Во-первых, Java использует .item(0) вместо [0], а во-вторых, потому что Java является строго типизированным и getAttribute является метод Element, а не Node, вам нужен бросок:

System.out.println(((Element)wElement.getElementsByTagName("nd").item(0)) 
        .getAttribute("ref")); 
+0

Спасибо, Ян. Первый раз с использованием стека и получил такой своевременный ответ. – user3034920

0

Ниже код может быть использован для получения значения атрибута реф и хранить их в ArrayList.

String s="<?xml version='1.0' encoding='UTF-8'?><osm version=\"0.6\" generator=\"Osmosis 0.43.1\"> <node id=\"95946773\" version=\"3\" timestamp=\"2009-11-14T15:52:46Z\" uid=\"17427\" user=\"dysteleologist\" changeset=\"3114170\" lat=\"26.2870135\" lon=\"-80.2120936\"/> <node id=\"95946776\" version=\"3\" timestamp=\"2010-10-23T15:07:03Z\" uid=\"207745\" user=\"NE2\" changeset=\"6146275\" lat=\"26.2870058\" lon=\"-80.2128489\"/><way id=\"226137459\" version=\"1\" timestamp=\"2013-06-17T20:19:27Z\" uid=\"1119200\" user=\"wagn\" changeset=\"16595491\"> <nd ref=\"2349898722\"/> <nd ref=\"2349898723\"/> <nd ref=\"2349898724\"/> <nd ref=\"2349898725\"/> <nd ref=\"2349898726\"/> <nd ref=\"2349898730\"/> <nd ref=\"2349898727\"/> <nd ref=\"2349898728\"/> <nd ref=\"2349898729\"/> <nd ref=\"2349898722\"/> <tag k=\"building\" v=\"house\"/> </way></osm>"; 


    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
    builderFactory.setNamespaceAware(true); 
    InputSource is = new InputSource(new StringReader(s)); 


    DocumentBuilder builder; 
    try { 
     builderFactory.setIgnoringElementContentWhitespace(true); 
     builder = builderFactory.newDocumentBuilder(); 
     Document xml = builder.parse(is); 
     XPathFactory factory = javax.xml.xpath.XPathFactory.newInstance(); 
     XPath xPath = factory.newXPath(); 
     XPathExpression expression; 

     expression = xPath.compile("/osm/way/nd/@ref"); 
     NodeList ss = (NodeList) expression.evaluate(xml,XPathConstants.NODESET); 
     ArrayList<String> list = new ArrayList<String>(); 
     for (int i = 0; i < ss.getLength(); i++) { 
      list.add(ss.item(i).getTextContent()); 
     } 
     System.out.println(list); 
    } catch (ParserConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SAXException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (XPathExpressionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
Смежные вопросы