2011-04-22 94 views
6

我有一个自定义的contentHandler(称为XMLHandler),我去过很多通过Google和StackOverflow的网站,详细介绍如何设置它。Android:从字符串问题解析XML

我不明白的是如何使用它。

Xml.parse(...,...)不返回任何内容,因为它是一个无效方法。

如何访问我已解析的XML数据?

我意识到这个问题可能是微不足道的,但我一直在寻找(字面上)小时,并没有找到解决办法。

请帮助。

String result = fetchData(doesntmatter); 
Xml.parse(result, new XMLHandler()); 
+0

你能发布你的XMLhandler吗? – 2011-04-22 05:43:49

回答

12

下面是一个例子,我希望这将是有益的理解“的SAXParser”

package test.example; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URL; 

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

import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class XMLParsingDemo extends Activity { 

    private final String MY_DEBUG_TAG = "WeatherForcaster"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     /* Create a new TextView to display the parsingresult later. */ 
     TextView tv = new TextView(this); 

     try { 
      /* Create a URL we want to load some xml-data from. */ 

     DefaultHttpClient hc = new DefaultHttpClient(); 
     ResponseHandler <String> res = new BasicResponseHandler(); 
     HttpPost postMethod = new HttpPost("http://www.anddev.org/images/tut/basic/parsingxml/example.xml"); 
     String response=hc.execute(postMethod,res); 

     /* Get a SAXParser from the SAXPArserFactory. */ 
     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 

     /* Get the XMLReader of the SAXParser we created. */ 
     XMLReader xr = sp.getXMLReader(); 
     /* Create a new ContentHandler and apply it to the XML-Reader*/ 
     ExampleHandler myExampleHandler = new ExampleHandler(); 
     xr.setContentHandler(myExampleHandler); 

     /* Parse the xml-data from our URL. */ 
     InputSource inputSource = new InputSource(); 
     inputSource.setEncoding("UTF-8"); 
     inputSource.setCharacterStream(new StringReader(response)); 

     /* Parse the xml-data from our URL. */ 
     xr.parse(inputSource); 
     /* Parsing has finished. */ 

     /* Our ExampleHandler now provides the parsed data to us. */ 
     ParsedExampleDataSet parsedExampleDataSet = myExampleHandler.getParsedData(); 


     /* Set the result to be displayed in our GUI. */ 
     tv.setText(response + "\n\n\n***************************************" + parsedExampleDataSet.toString()); 



     } catch (Exception e) { 
      /* Display any Error to the GUI. */ 
      tv.setText("Error: " + e.getMessage()); 
      Log.e(MY_DEBUG_TAG, "WeatherQueryError", e); 
     } 
     /* Display the TextView. */ 
     this.setContentView(tv); 
    } 

    public class ExampleHandler extends DefaultHandler { 

     // =========================================================== 
     // Fields 
     // =========================================================== 

     private boolean in_outertag = false; 
     private boolean in_innertag = false; 
     private boolean in_mytag = false; 

     private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet(); 

     // =========================================================== 
     // Getter & Setter 
     // =========================================================== 

     public ParsedExampleDataSet getParsedData() { 
      return this.myParsedExampleDataSet; 
     } 

     // =========================================================== 
     // Methods 
     // =========================================================== 
     @Override 
     public void startDocument() throws SAXException { 
      this.myParsedExampleDataSet = new ParsedExampleDataSet(); 
     } 

     @Override 
     public void endDocument() throws SAXException { 
      // Nothing to do 
     } 

     /** Gets be called on opening tags like: 
     * <tag> 
     * Can provide attribute(s), when xml was like: 
     * <tag attribute="attributeValue">*/ 
     @Override 
     public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes atts) throws SAXException { 
      super.startElement(uri, localName, qName, atts); 
      if (localName.equals("outertag")) { 
       this.in_outertag = true; 
      } 
      else if (localName.equals("innertag")) { 
       String attrValue = atts.getValue("sampleattribute"); 
       myParsedExampleDataSet.setExtractedString(attrValue); 
       this.in_innertag = true; 
      } 
      else if (localName.equals("mytag")) { 
       this.in_mytag = true; 
      } 
      else if (localName.equals("tagwithnumber")) { 
       // Extract an Attribute 
       String attrValue = atts.getValue("thenumber"); 
       int i = Integer.parseInt(attrValue); 
       myParsedExampleDataSet.setExtractedInt(i); 
      } 

     } 


     /** Gets be called on closing tags like: 
     * </tag> */ 
     @Override 
     public void endElement(String namespaceURI, String localName, String qName) 
       throws SAXException { 
      if (localName.equals("outertag")) { 
       this.in_outertag = false; 
      }else if (localName.equals("innertag")) { 
       this.in_innertag = false; 
      }else if (localName.equals("mytag")) { 
       this.in_mytag = false; 
      }else if (localName.equals("tagwithnumber")) { 
       // Nothing to do here 
      } 
     }  


     /** Gets be called on the following structure: 
     * <tag>characters</tag> */ 
     @Override 
     public void characters(char ch[], int start, int length) { 
      if(this.in_mytag){ 
       myParsedExampleDataSet.setExtractedString(new String(ch)); 
      } 
     } 
    } 

    public class ParsedExampleDataSet { 
     private String extractedString = null; 
     private int extractedInt = 0; 

     public String getExtractedString() { 
      return extractedString; 
     } 
     public void setExtractedString(String extractedString) { 
      this.extractedString = extractedString; 
     } 

     public int getExtractedInt() { 
      return extractedInt; 
     } 
     public void setExtractedInt(int extractedInt) { 
      this.extractedInt = extractedInt; 
     } 

     public String toString(){ 
      return "\n\n\nExtractedString = " + this.extractedString 
        + "\n\n\nExtractedInt = " + this.extractedInt; 
     } 

    } 

} 
+1

谢谢,这正是我所需要的。 – Donut 2011-04-23 00:44:16

1

您有权访问你的XML数据转换,你必须通过XMLHandler()

定义处理程序

你必须覆盖

public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes atts) throws SAXException { 

} 


@Override 
    public void endElement(String namespaceURI, String localName, String qName) { 

} 

@Override 
    public void characters(char ch[], int start, int length) { 

    } 
+0

我已经有一个处理程序,并且我在该问题中指定了该处理程序。我的问题是我如何使用它。 Vaibhav Jani用一个例子回答了这个问题。 – Donut 2011-04-23 00:43:56

+0

如果我的字符串包含输入或某些特殊字符? – MobileEvangelist 2012-10-05 08:29:26

+0

创建一个字符串缓冲区并将字符串追加到缓冲区中,直到标签结束。 – Dharmendra 2012-10-05 08:55:46