Android: parse XML from string problems

前端 未结 2 953
梦如初夏
梦如初夏 2020-12-03 22:51

I\'ve got a custom contentHandler (called XMLHandler), I\'ve been to a lot of sites via Google and StackOverflow that detail how to set that up.

What I do not unders

2条回答
  •  温柔的废话
    2020-12-03 23:44

    Here is one example i hope it will be usefull to understand "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  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: 
             *  
             * Can provide attribute(s), when xml was like:
             * */
            @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: 
             *  */
            @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: 
             * characters */
            @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;
            }
    
        }
    
    }
    

提交回复
热议问题