Тема: Парсинг XML документа по URL

Потрібно пропарсити XML документ: http://qps.ru/7UzLc
Як я розумію, є три варіанти:
1) скачати документ на флешку і тоді парсити;
2) напряму в парсер;
3) в стрінг-перемінну, а потім її парсити.
Ось сам парсер (DOM):

// XML-parser and output.
                try {
                    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
                    //Document doc = docBuilder.parse(new File("/mnt/sdcard/download/weather.ashx.xml"));
                    Document doc = docBuilder.parse(new URL("http://free.worldweatheronline.com/feed/weather.ashx?q=Kijew&format=xml&num_of_days=3&key=c17b22aeea083658120612").openStream());         
 
                    // Normalize text representation.
                    doc.getDocumentElement ().normalize ();
                    //
                    NodeList listOfPersons = doc.getElementsByTagName("request");
 
                    for(int s=0; s<listOfPersons.getLength() ; s++){
                        Node firstPersonNode = listOfPersons.item(s);
                        if(firstPersonNode.getNodeType() == Node.ELEMENT_NODE){
                            Element firstPersonElement = (Element)firstPersonNode;
                            //----
                            NodeList firstNameList = firstPersonElement.getElementsByTagName("query");
                            Element firstNameElement = (Element)firstNameList.item(0);
                            NodeList textFNList = firstNameElement.getChildNodes();
                            
                            textView1.setText("City: " + 
                                   ((Node)textFNList.item(0)).getNodeValue().trim());                           
                        }
                    }
                }catch (SAXParseException err) {
                textView2.setText("** Parsing error" + ", line " 
                     + err.getLineNumber () + ", uri " + err.getSystemId ());
                textView2.setText(" " + err.getMessage ());
 
                }catch (SAXException e) {
                Exception x = e.getException ();
                ((x == null) ? e : x).printStackTrace ();
 
                }catch (Throwable t) {
                t.printStackTrace ();
                }
                //System.exit (0);
            }           
                                                    
        };

В коді використаний другий варіант, але нічого не відбувається.
Досвіду у мене мало, скільки не пробував зробити по зразкам з інтернету, так нічого й не виходило. Поможіть, будь ласка! Дякую.

2 Востаннє редагувалося Patron (10.12.2012 22:08:33)

Re: Парсинг XML документа по URL

Робочий код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication4;

import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 *
 * @author Admin
 */
public class JavaApplication4 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        // XML-parser and output.
                try {
                    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
                    //Document doc = docBuilder.parse(new File("/mnt/sdcard/download/weather.ashx.xml"));
                    Document doc = (Document) docBuilder.parse(new URL("http://free.worldweatheronline.com/feed/weather.ashx?q=Kijew&format=xml&num_of_days=3&key=c17b22aeea083658120612").openStream());         
 
                    // Normalize text representation.
                    doc.getDocumentElement().normalize ();
                    //
                    NodeList listOfPersons = doc.getElementsByTagName("request");
 
                    for(int s=0; s < listOfPersons.getLength() ; s++){
                        Node firstPersonNode = listOfPersons.item(s);
                        if(firstPersonNode.getNodeType() == Node.ELEMENT_NODE){
                            Element firstPersonElement = (Element) firstPersonNode;
                            //----
                            NodeList firstNameList = firstPersonElement.getElementsByTagName("query");
                            Element firstNameElement = (Element) firstNameList.item(0);
                            NodeList textFNList = firstNameElement.getChildNodes(); 
                            //для перевірки вивожу назву тегу елементу
                            System.err.println(firstNameElement.getTagName());
                        }
                    }
                }   catch (SAXParseException err) {
                    System.err.println("** Parsing error" + ", line " 
                         + err.getLineNumber () + ", uri " + err.getSystemId ());
                    System.err.println(" " + err.getMessage ());
                }   catch (SAXException e2) {
                    e2.printStackTrace();
                }   catch (Throwable t) {
                    t.printStackTrace();
                }
                //System.exit (0);
            }           
}
Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }
Подякували: LukeSkywalker1

3 Востаннє редагувалося LukeSkywalker (10.12.2012 23:11:50)

Re: Парсинг XML документа по URL

Вставив Ваш код в свою програму, але вона не працює! Точніше запускається, але коли я натискаю Button, нічого не відбувається, а на місці textView1 має бути написано: "City: Kijew, Ukraine". Що я зробив не так?

MainActivity.java:

package com.example.coursework;

import java.net.URL;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
    
    TextView textView1;
    TextView textView2;
    Button btnRfrsh;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // Finding new objects.
        textView1 = (TextView) findViewById(R.id.textView1);
        textView2 = (TextView) findViewById(R.id.textView2);
        btnRfrsh = (Button) findViewById(R.id.btnRfrsh);
        
        // Handler of Refresh button press.
        OnClickListener oclbtnRfrsh = new OnClickListener() {        
            @Override
            public void onClick(View v) {
                
                // XML-parser and output.
                try {
                    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
                    //Document doc = docBuilder.parse(new File("/mnt/sdcard/download/weather.ashx.xml"));
                    Document doc = (Document) docBuilder.parse(new URL("http://free.worldweatheronline.com/feed/weather.ashx?q=Kijew&format=xml&num_of_days=3&key=c17b22aeea083658120612").openStream());         
 
                    // Normalize text representation.
                    doc.getDocumentElement().normalize ();
                    //
                    NodeList listOfPersons = doc.getElementsByTagName("request");
 
                    for(int s=0; s < listOfPersons.getLength() ; s++){
                        Node firstPersonNode = listOfPersons.item(s);
                        if(firstPersonNode.getNodeType() == Node.ELEMENT_NODE){
                            Element firstPersonElement = (Element) firstPersonNode;
                            //----
                            NodeList firstNameList = firstPersonElement.getElementsByTagName("query");
                            Element firstNameElement = (Element) firstNameList.item(0);
                            NodeList textFNList = firstNameElement.getChildNodes(); 
                            //для перевірки вивожу назву тегу елементу
                            System.err.println(firstNameElement.getTagName());
                            textView1.setText("City: " + 
                                    ((Node)textFNList.item(0)).getNodeValue().trim());    
                        }
                    }
                }   catch (SAXParseException err) {
                    System.err.println("** Parsing error" + ", line " 
                         + err.getLineNumber () + ", uri " + err.getSystemId ());
                    System.err.println(" " + err.getMessage ());
                }   catch (SAXException e2) {
                    e2.printStackTrace();
                }   catch (Throwable t) {
                    t.printStackTrace();
                }
                //System.exit (0);
                

            }               
                                                       
        };
        
        // Assign handler to Refresh button.
        btnRfrsh.setOnClickListener(oclbtnRfrsh);
        
    }

    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="14dp"
        android:layout_marginTop="24dp"
        android:text="Small Text"
        android:textAppearance="?android:attr/textAppearanceSmall" />

    <Button
        android:id="@+id/btnRfrsh"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="25dp"
        android:text="Button" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/btnRfrsh"
        android:layout_marginLeft="76dp"
        android:layout_toRightOf="@+id/btnRfrsh"
        android:text="Small Text"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</RelativeLayout>

4 Востаннє редагувалося Patron (10.12.2012 23:29:30)

Re: Парсинг XML документа по URL

Я не знаю що має робити ваша програма. Той код який виклав парсить XML і виводить назву тегу на консоль, тобто він працює. Ви ж написали в назві теми "Парсинг XML документа по URL", ось вам був код який парсить XML  по URL.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

5

Re: Парсинг XML документа по URL

Може як "Java project" вона й працює, як "Android Application project" - по-моєму ні. Тобто, може програма парсить  правильно, але теги в textView1 не виводить. В чому може бути проблема?

6

Re: Парсинг XML документа по URL

хз, я для Андроїда нічого не писав і ніколи не створював проекти типу "Android Application project"

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }