2010-12-10 3 views
0

を取得します。私のプログラムは似ていますが、いくつかのノード内にネストされた情報を取得したいのですが、どうやって取得するのか分かりません。私は「html_instructions」タグで情報を検索する際に、実際にのみ関心んだけど、それは「ルート」、「足」でネストされている、と解析XML&ノードディープの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ファイルです"ステップ"タグ。私は、XMLの解析について、SOに関するいくつかのチュートリアルや質問を見てきましたが、これに対する解決策を見つけることはできませんでした。いずれの方向にも大いに感謝します!

ありがとうございました。

答えて

4

があなたのために良い選択である(、それは高速で、すべての不要なデータをフィルタリングすることができ、低メモリを消費します)。初めて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を使用しています。しかし、私はどのようにSAXコードとHttpRequestを一緒に持っていくのか分かりません。私はそれが十分明確であることを望む。どんな洞察力にも大変感謝していますので、私はこれすべての週末にこれに取り組んでいきます。 – malfunction

+0

それは意味の「Webページなどのコンテンツを表示する」何を「のWebからファイル」とに依存します。 URLが常に同じファイルの場合は、 'java.net.URLConnection'クラスを使い、ファイルを' java.io.InputStream'として取得することができます。私はストリームのようにファイルを扱うことをお勧めします。これは、特に非常に大きくなる可能性のある生成されたファイルに対して特に有効です。次に、HTMLファイルを出力として生成することができます。あるいは、JavaServletで作業していて、XMLファイルがユーザーによってアップロードされ、出力がWebブラウザーへの直接の応答として生成されますか? –

3

使用SAXのみhtml_instructionsタグに注意を払います。ハンドラは各要素に対してstartElement()で呼び出され、要素の名前で渡されます。その名前を"html_instructions"と比較してください。一致する場合は、対応するendElement()コールまで処理されたすべてのノードに注意してください。だから、基本的にはSAXパーサーを使用して

+0

おかげで、CommonsWare - 私の携帯電話のプログラミングコースは、Androidの開発にあなたの本ビジーコーダーズ・ガイドを使用している&それは素晴らしいことです! – malfunction

+0

@関数:嬉しいですね! – CommonsWare

関連する問題