2013-11-26 5 views
0

"way"요소 아래에있는 각 "nd"에 대한 "ref"정보를 추출하려고합니다. 일반 자바 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> 

"way"요소를 추출하는 코드.

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()); 

아래에 마지막 인쇄 라인을 변경 "차"노드 이름으로,하지만 난 노드의 속성을 얻을 수 없습니다.

자바 스크립트에서는 다음과 같이 작동하지만 자바에서는이 구문이 작동하지 않습니다.

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

감사합니다,

토니

+1

가 JAXB 컨텍스트 마샬 방법 비 정렬 화 –

+0

추출물을 사용하여 시도 : 첫째 자바 대신 [0].item(0) 사용, 둘째 자바는 강력한 형식 때문에, 그리고 getAttributeElement보다는 Node하는 방법, 당신은 깁스를해야합니까? 지금까지 시도한 Java 코드를 보여주십시오. –

답변

0

이 구문은 자바에서 작동하지 않습니다.

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

당신이 거기 변경해야 할 두 가지가 있습니다.

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

고맙습니다, 이안. 처음으로 stackflow를 사용하여시기 적절한 대답을 얻었습니다. – 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(); 
    } 
}