首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML错误,org.xmlpull.v1.XmlPullParserException

XML错误,org.xmlpull.v1.XmlPullParserException
EN

Stack Overflow用户
提问于 2014-01-13 15:14:01
回答 1查看 850关注 0票数 1

我试着用Android做一个应用程序聊天机器人。我使用Pandorabots作为聊天机器人服务器。要在Android设备与服务器之间连接。我使用pandorabot,我使用来自android-xmlrpc的xml库。所以这是我的代码:

代码语言:javascript
复制
public class MainActivity extends Activity {
private EditText editOne;
private TextView textOne;
private Button ButtonOne;
private XMLRPCClient server;
private URI uri;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    uri = URI.create("http://www.pandorabots.com/pandora/talk-xml?botid=e80e92407e341007");
    server = new XMLRPCClient(uri);
    editOne = (EditText) findViewById(R.id.editText1);
    textOne = (TextView) findViewById(R.id.textView1);
    ButtonOne = (Button) findViewById(R.id.button1);

    textSatu.setText(getDataMethod("hi"));
}

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


private String getDataMethod(String num) {
    String text = "";
    try {
        Log.w("Running server.call", "prosess");
        Object[] data = (Object[]) server.call("input", num);
        Log.w("server.call Run", "finish");
        Log.w("Run HashMap", "prosess");
        for(Object o: data) {
            HashMap map = (HashMap) o;
            Log.w("HashMap Berjalan", "Error");
            text = text + "'that' => " + map.get("that") + "\n\n";
        }
    } catch (XMLRPCException e) {
        Log.w("XMLRPC Test", "Error", e);
        text = "XMLRPC error";
    }       
    return text;
}


 }

但我错了。例如:org.xmlpull.v1.XmlPullParserException: expected: START_TAG {null}methodResponse (java.io.InputStreamReader@41174280中的position:START_TAG @1:45 )

有谁可以帮我?请。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-15 18:52:17

这里有一个不需要XMLRPCClient的解决方案。重要的是在与bot的第一次交互中捕获客户ID,然后将custid的值与每个后续事务一起发回。bot使用custid来记住与会话线程相关的局部变量,如名称、年龄、性别、主题等。

代码语言:javascript
复制
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URLEncoder;
public class PandorabotsTalkAPI {
    public String defaultCustid = "0";
    public String custid = defaultCustid;
    public String responseFailed = "RESPONSE FAILED";
    public String defaultBotId = "f5d922d97e345aa1";
    public String defaultHost = "www.pandorabots.com";
    public String askPandorabots(String input) {
        return askPandorabots(input, defaultHost, defaultBotId);
    }
    public String askPandorabots(String input, String host, String botid) {
        //System.out.println("Entering askPandorabots with input="+input+" host ="+host+" botid="+botid);
        String responseContent = pandorabotsRequest(input, host, botid);
        if (responseContent == null) return responseFailed;
        else return pandorabotsResponse(responseContent, host, botid);
    }
    public String responseContent(String url) throws Exception {
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet();
        request.setURI(new URI(url));
        InputStream is = client.execute(request).getEntity().getContent();
        BufferedReader inb = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder("");
        String line;
        String NL = System.getProperty("line.separator");
        while ((line = inb.readLine()) != null) {
            sb.append(line).append(NL);
        }
        inb.close();
        return sb.toString();
    }


    public String spec(String host, String botid, String custid, String input) {
        //System.out.println("--> custid = "+custid);
        String spec = "";
        try {
            if (custid.equals("0"))      // get custid on first transaction with Pandorabots
                spec =    String.format("%s?botid=%s&input=%s",
                        "http://" + host + "/pandora/talk-xml",
                        botid,
                        URLEncoder.encode(input, "UTF-8"));
            else spec =                 // re-use custid on each subsequent interaction
                    String.format("%s?botid=%s&custid=%s&input=%s",
                            "http://" + host + "/pandora/talk-xml",
                            botid,
                            custid,
                            URLEncoder.encode(input, "UTF-8"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        //System.out.println(spec);
        return spec;
    }

    public String pandorabotsRequest(String input, String host, String botid) {
        try {

            String spec = spec(host, botid, custid, input);
            //System.out.println("Spec = "+spec);
            String responseContent = responseContent(spec);
            return responseContent;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
    public String pandorabotsResponse (String xmlRpcResponse, String host, String botid) {
        String botResponse = responseFailed;
        try {
            int n1 = xmlRpcResponse.indexOf("<that>");
            int n2 = xmlRpcResponse.indexOf("</that>");

            if (n2 > n1)
                botResponse = xmlRpcResponse.substring(n1+"<that>".length(), n2);
            n1 = xmlRpcResponse.indexOf("custid=");
            if (n1 > 0) {
                custid = xmlRpcResponse.substring(n1+"custid=\"".length(), xmlRpcResponse.length());
                n2 = custid.indexOf("\"");
                if (n2 > 0) custid = custid.substring(0, n2);
                else custid = defaultCustid;
                }
            if (botResponse.endsWith(".")) botResponse = botResponse.substring(0, botResponse.length()-1);   // snnoying Pandorabots extra "."
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return botResponse;
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21094698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档