http响应中的垃圾值

时间:2011-04-04 09:38:11

标签: java android xml string response

我正在研究android并从http获取响应我的xml代码包含很多垃圾值在tahe end ..我该如何删除那些垃圾...... 请建议

我的带有垃圾值的xml字符串是

<player><id>1</id><name>sachin</name><value>98</value></player>ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ

这里是我创建数组并返回其值

的代码
    private ArrayList<String> id = new ArrayList<String>();
    private ArrayList<String> name = new ArrayList<String>();
    private ArrayList<String> score = new ArrayList<String>();
    private ArrayList<String> value = new ArrayList<String>();

    public ArrayList<String> getId() {
        return id;
    }

    public void setId(String id) {
        this.id.add(id);
    }

    public ArrayList<String> getName() {
        return name;
    }

    public void setName(String name) {
        this.name.add(name);
    }

    public ArrayList<String> getScore() {
        return score;
    }
    public void setScore(String score) {
        this.score.add(score);
    }

    public ArrayList<String> getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value.add(value);
    }

这是我访问值的代码:

Boolean currentElement = false;
String currentValue = null;
public static ScoreList scorelist = null;

public static ScoreList getScorelist() {
    return scorelist;
}

public static void setScoreList(ScoreList scorelist) {
    XMLHandler.scorelist = scorelist;
}

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

    currentElement = true;

  if (localName.equals("id"))
    {
        /** Start */
        scorelist = new ScoreList();
        }else if (localName.equals("id")) {
        }else if (localName.equals("name")) {
        }else if (localName.equals("score")) {
        }else if (localName.equals("value")) {
    }

    }

        @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {

    currentElement = false;

            if (localName.equalsIgnoreCase("id"))
            scorelist.setId(currentValue);
        if (localName.equalsIgnoreCase("name"))
            scorelist.setName(currentValue);
        else if (localName.equalsIgnoreCase("score"))
            scorelist.setScore(currentValue);
        else if (localName.equalsIgnoreCase("value"))
            scorelist.setValue(currentValue);

    }

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

        if (currentElement) {
            currentValue = new String(ch, start, length);
            currentElement = false;
        }

    }

这里在我的http代码中我也提供了字节长度,但它仍然给出了垃圾值..因为它抛出空指针和字符串超出绑定异常..我的代码是

                UrlEncodedFormEntity p_entity = new UrlEncodedFormEntity(nvps,HTTP.UTF_8);
                httppost.setEntity(p_entity);
                HttpResponse response = client.execute(httppost);
                Log.v(TAG, response.getStatusLine().toString());
                HttpEntity responseEntity = response.getEntity();
                InputStream in=responseEntity.getContent();

                byte[] bData = new byte[1024];
                in.read(bData);
                System.out.println("In Data"+in.toString());
                String st=new String (bData);

                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParser sp = spf.newSAXParser();
                XMLReader xr = sp.getXMLReader();

                System.out.println("Response from server"+responseEntity);
                XMLHandler myXMLHandler = new XMLHandler();
                xr.setContentHandler(myXMLHandler);
                xr.parse(retrieveInputStream(responseEntity));

2 个答案:

答案 0 :(得分:4)

正如我所料。在这段代码中:

byte[] bData = new byte[1024];
in.read(bData);
System.out.println("In Data"+in.toString());
String st=new String (bData);

您阅读了一些文字,然后将整个byte[] 转换为String,即使您没有用{{填充整个byte[] 1}} - 打电话。此外,如果有更多数据(即,如果您的内容超过1024字节),则忽略。

最简单的解决方案是直接使用read InputSource自我:

InputStream

SAX解析器已经知道如何处理xr.parse(new InputSource(in)); 并为您完成所有这些操作。没有必要重新实现这种行为。

如果绝对必须在内存中读取整个响应,那么您需要使用这样的代码(但我不鼓励这样做):

InputStream

另请注意,将此转换为ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int read; while ((read=in.read(buf))!=-1) { baos.write(buf, 0, read); } byte[] output = baos.toByteArray(); 并非易事,因为XML可能具有任何编码,您需要检测正确的编码才能正确地将String转换为{{{} 1}}。

答案 1 :(得分:0)

您必须获取已读取的字节数,然后使用此值进行截断。

你也可以获得Content-Length标题并用它来确定身体的长度