安卓:处理程序返回空字符串解析XML与SAX解析器 [英] Android: Handler returns empty string parsing XML with SAX Parser

查看:107
本文介绍了安卓:处理程序返回空字符串解析XML与SAX解析器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试使用在Android SAX解析器来显示一些XML是一个查询到数据库的结果。

I have been trying to use the SAX parser on Android to display some xml that is the result of a query to a DB.

我从DB获得正确的答案,但是当我需要解析的XML和转储内容转换成文本来看,ExampleHandler(ParsedExampleDataSet)返回一个空字符串对象。我一直在试图追查问题出在哪里,但它逃避我。

I get the right answer from the DB, but when I want to parse the xml and dump the content into a Text view, the ExampleHandler (ParsedExampleDataSet) returns an Object with an empty string. I have been trying to trace where the problem is but it eludes me.

到目前为止,我所知道的数据中的字符方法正确分析,我设法打印的内容输出到日志文件中,但我不能在这一点上返回字符串。

So far I know the data is parsed correctly in the characters method, I managed to print the content out to the Log file, but I cannot return the string at that point.

我相信更多的实验性的程序员可以很容易地解决这个问题:

I am sure more experimented programmers could fix this very easily:

我的xml文件是pretty基础,<身体GT; blablablah< / BODY方式>

My xml file is pretty basic, <body> blablablah </body>.

下面是文件:

 package com.ignacio.BilingualSTT;

 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 import android.util.Log;
 import org.apache.http.HttpResponse;
 import org.apache.http.NameValuePair;  
 import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.util.ByteArrayBuffer;
 import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;
 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.TextView;
 import android.widget.Toast;

public class PostAndGet extends Activity {

    private static String Utterance = null;
    TextView Title;
    TextView Content;
    private static final String TAG = "TextToSpeechDemo";
    String text;

    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.en_results);
            Title = (TextView)findViewById(R.id.A1_title);
            Content= (TextView) findViewById(R.id.A1_content);
            text = "";

            Bundle b = this.getIntent().getExtras();
            if (b !=null){
                    Utterance = b.getString("query");
            }
            postData(Utterance);
    }

    /**
 * Handle the action of the Back button
 */

public void sendback(View v)
{
    Intent Sendback=new Intent(this, EnglishRecognizer.class);
            startActivity(Sendback);
}

/**
 * Start HTTP Post call
 */

public void postData(String Utterance){
            // Create a new HttpClient and Post Header
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://hcc.cs.clemson.edu/~ignm/ignacio/Android_QueryResults.php");  

            try {
                    // Add data to the HTTP Request data has to be named query since the PHP page in the server is expecting that name to run the query on the DB
                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);  
                    nameValuePairs.add(new BasicNameValuePair("query", Utterance));
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                    // Execute HTTP Post Request and retrieve answer from PHP side.
                    HttpResponse response = httpclient.execute(httppost);
                    InputStream is = response.getEntity().getContent();
                    BufferedInputStream bis = new BufferedInputStream(is);
                    ByteArrayBuffer baf = new ByteArrayBuffer(20);
                    int current = 0;

                    while((current = bis.read()) != -1){
                            baf.append((byte)current);
                    }  

                    // Convert the Bytes read to a String and display it in the Title Container
                    text = new String(baf.toByteArray());
                    Title.setText(text);

                    //Send Text to
                    parseXML (text);


            } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    Toast.makeText(this, "Error in the connection", Toast.LENGTH_SHORT).show();
            } catch (IOException e) {
                    // TODO Auto-generated catch block
                    Toast.makeText(this,"IO Exception error", Toast.LENGTH_SHORT).show();
            }
    }


public void parseXML (String text){

    String AnswerExt = text;

    try {
            /* Create a URL we want to load some xml-data from. */
            URL url = new URL("http://hcc.cs.clemson.edu/~ignm/ignacio/"+AnswerExt.toString());

            Log.i(TAG, url.toString());

            /* 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. */
            xr.parse(new InputSource(url.openStream()));
            /* 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. */
            Content.setText(parsedExampleDataSet.getExtractedString());


    } catch (Exception e) {
             /* Display any Error to the GUI. */
             Content.setText("Error: " + e.getMessage());
             Log.e(TAG, "QueryError", e);
    }
}
}

例处理程序修改,以适应我的XML的解析。

Example Handler modified to fit the parsing of my xml.

 package com.ignacio.BilingualSTT;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler; 
 import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;

public class ExampleHandler extends DefaultHandler{

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

    private boolean bodytag = false;
    private static final String TAG = "TextToSpeechDemo";

    public ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet();
    public String myReturnString = null;

    // ===========================================================
    // 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 namespaceURI, String localName,
                    String qName, Attributes atts) throws SAXException {
            if (localName.equals("body")) {
                    this.bodytag = true;
            }
    }

    /** Gets be called on closing tags like:
     * </tag> */
    @Override
    public void endElement(String namespaceURI, String localName, String qName)
                    throws SAXException {
            if (localName.equals("body")) {
                    this.bodytag = false;
            }
    }

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

 }

ParsedExampleDataSet:

ParsedExampleDataSet:

 package com.ignacio.BilingualSTT;

  public class ParsedExampleDataSet {
    private String extractedString = "No content yet";

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

太谢谢你了!

推荐答案

字符方法被调用多次,而标签内,特别是如果元素值包含空格

The characters method can get called multiple times while inside a tag, especially if the element value contains whitespace.

您也许能够看到这种情况出现在正在打印由多行的logcat 电话。

You might be able to see this happening in that Logcat call by multiple lines being printed.

从<一个href=\"http://developer.android.com/reference/org/xml/sax/ContentHandler.html#characters%28char%5b%5d,%20int,%20int%29\"相对=nofollow>文档:

解析器将调用此方法来报告字符的每个块
  数据。 SAX解析器能够在一个单一的返回所有的连续字符数据
  块,也可以将其分割成几个存储块;然而,所有的
  任何单个事件中的字符必须来自同一个外部实体
  所以定位器能够提供有用的信息。

The Parser will call this method to report each chunk of character data. SAX parsers may return all contiguous character data in a single chunk, or they may split it into several chunks; however, all of the characters in any single event must come from the same external entity so that the Locator provides useful information.

而不是使用setExtractedString,你应该附加到的被建立起来,可能使用的字符串的StringBuilder

Rather than using setExtractedString, you should append to the string that's being built up, possibly using a StringBuilder.

请参阅接受的答案<一个href=\"http://stackoverflow.com/questions/2838099/android-sax-parser-not-getting-full-text-from-between-tags\">here.

这篇关于安卓:处理程序返回空字符串解析XML与SAX解析器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆