2010-12-10 4 views
0

일기 예보 사이트에서 데이터를 가져 와서 목록에 기상 조건을 표시하기 위해 XML 파일을 구문 분석하는 내 교수가 제공 한 예제에서 작업하고 있습니다. 내 프로그램도 비슷하지만 여러 노드에 중첩 된 정보를 검색하려고하는데 어떻게해야할지 모르겠다. 저는 여기에서 일하고 있어요 XML 파일입니다 : 나는 "html_instructions"태그의 정보를 검색 정말에만 관심Parse XML & Retrieve Info 노드의 여러 레이어 Deep Java/Android

<?xml version="1.0" encoding="UTF-8"?> 
<DirectionsResponse> 
<status>OK</status> 
<route> 
    <summary>S Street Viaduct</summary> 
    <leg> 
    <step> 
    <travel_mode>DRIVING</travel_mode> 
    <start_location> 
    <lat>40.7021400</lat> 
    <lng>-74.0158200</lng> 
    </start_location> 
    <end_location> 
    <lat>40.7021400</lat> 
    <lng>-74.0158200</lng> 
    </end_location> 
    <polyline> 
    <points>kslwFzewbM</points> 
    <levels>B</levels> 
    </polyline> 
    <duration> 
    <value>0</value> 
    <text>1 min</text> 
    </duration> 
    <html_instructions>Head &lt;b&gt;east&lt;/b&gt; on &lt;b&gt;S Street Viaduct&lt;/b&gt;</html_instructions> 
    <distance> 
    <value>0</value> 
    <text>1 ft</text> 
    </distance> 
    </step> 
    <duration> 
    <value>0</value> 
    <text>1 min</text> 
    </duration> 
    <distance> 
    <value>0</value> 
    <text>1 ft</text> 
    </distance> 
    <start_location> 
    <lat>40.7021400</lat> 
    <lng>-74.0158200</lng> 
    </start_location> 
    <end_location> 
    <lat>40.7021400</lat> 
    <lng>-74.0158200</lng> 
    </end_location> 
    <start_address>S Street Viaduct, New York, NY 10004, USA</start_address> 
    <end_address>S Street Viaduct, New York, NY 10004, USA</end_address> 
    </leg> 
    <copyrights>Map data ©2010 Google, Sanborn</copyrights> 
    <overview_polyline> 
    <points>kslwFzewbM</points> 
    <levels>B</levels> 
    </overview_polyline> 
</route> 
</DirectionsResponse> 

는하지만은 "경로"중첩 "다리"하고, "단계"태그. 나는 XML에 대한 파싱에 관한 몇 가지 자습서와 질문을 보았지만 이에 대한 해결책을 찾지 못했습니다. 모든 방향은 크게 감사하겠습니다!

감사합니다.

답변

4

SAX 파서는 기본적으로 SAX 파서를 사용하는 것이 좋습니다 (빠르기 때문에 불필요한 데이터를 모두 필터링하고 메모리를 적게 소비 함). SAX로 처음으로 작업 할 때 다음 예제가 유용 할 수 있습니다. 나는 코드가 완벽하다고 (예 : 예외 처리, 안전한 스트림 종료 등을 놓친다) 말하지 않지만, 좋은 시작점이 될 수있다.

 

import java.io.FileInputStream; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.List; 

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class Test { 

    private static final String HTML_INSTRUCTIONS = "html_instructions"; 

    public static void main(String[] args) throws Exception { 
    final List htmlInstructions = new ArrayList(); 

    SAXParserFactory spf = SAXParserFactory.newInstance(); 
    SAXParser sp = spf.newSAXParser(); 
    DefaultHandler dh = new DefaultHandler() { 
     private boolean isHtmlInstructions = false; 
     private StringBuilder sb = new StringBuilder(); 
     @Override 
     public void startElement(String uri, String localName, String name, 
      Attributes attributes) throws SAXException { 
     super.startElement(uri, localName, name, attributes); 
     if (HTML_INSTRUCTIONS.equals(name)) { 
      isHtmlInstructions = true; 
     } 
     } 

     @Override 
     public void characters(char ch[], int start, int length) 
     throws SAXException { 
     if (isHtmlInstructions) { 
      sb.append(ch, start, length); 
     } 
     } 

     @Override 
     public void endElement(String uri, String localName, String name) 
      throws SAXException { 
     super.endElement(uri, localName, name); 
     if (HTML_INSTRUCTIONS.equals(name)) { 
      htmlInstructions.add(sb.toString()); 
      sb.delete(0, sb.length()); 
      isHtmlInstructions = false; 
     } 
     } 
    }; 

    InputStream is = new FileInputStream("test.xml"); 
    sp.parse(is, dh); 
    for (String htmlInstruction : htmlInstructions) { 
     System.out.println(htmlInstruction); 
    } 

    } 

} 
 

출력은 다음과 같아야합니다

 

Head <b>east on <b>S Street Viaduct</b> 
 
+0

답장을 보내 주셔서 감사합니다. 무슨 일이 일어나는지 이해하는 데 정말로 도움이되었습니다. 웹에서 생성 된 XML 파일을 구문 분석하려고했지만 웹 페이지로 내용을 표시하는 것은 어렵습니다. 내 교수의 전에서 HttpRequest 인스턴스를 생성 한 다음에 볼 수 있음을 알았습니다. HttpGet getMethod = new HttpGet (ADDRESS); 그런 다음 responseHandler를 사용하여 파일을 String으로 가져옵니다. 그렇다면 SAX 코드와 HttpRequest를 함께 가져 오는 방법을 모르겠습니다. 그게 충분히 명확 해지기를 바랍니다. 어떤 통찰력이라도 대단히 감사 할 수 있도록 이번 주말에이 작업을 할 것입니다. – malfunction

+0

"웹의 파일"과 "웹 페이지의 콘텐츠 표시"의 의미에 따라 다릅니다. URL가 항상 같은 파일의 경우는,'java.net.URLConnection' 클래스를 사용해, java.io.InputStream로서 파일을 취득 할 수 있습니다. 스트림 작업과 같이 파일 작업을하는 것이 좋으며 특히 매우 커질 수있는 생성 된 파일에 특히 유용합니다. 그런 다음 HTML 파일을 출력으로 생성 할 수 있습니다. 아니면 JavaServlet에서 작업하고 XML 파일이 사용자에 의해 업로드되고 출력이 웹 브라우저에 대한 직접 응답으로 생성됩니까? –

3

SAX를 사용하고 html_instructions 태그에만주의하십시오. 핸들러는 각 요소에 대해 startElement()과 함께 호출되며 요소의 이름으로 전달됩니다. 해당 이름을 "html_instructions"과 비교하십시오. 일치하는 항목이있을 경우 해당 endElement() 호출이있을 때까지 처리 된 모든 노드에주의하십시오.

+0

감사합니다, CommonsWare - 내 모바일 프로그래밍 과정은이 위대한 책 안드로이드 개발 및 바쁜 코더의 가이드를 사용! – malfunction

+0

@malfunction : 당신이 좋아하는 것을 기쁘게 생각합니다! – CommonsWare

관련 문제