【问题标题】:Garbage value in http responsehttp响应中的垃圾值
【发布时间】:2011-04-04 09:38:11
【问题描述】:

我在 android 上工作并从 http 获取响应我的 xml 代码在 tahe 端包含很多垃圾值.. 我如何删除这些垃圾... 请建议

我的带有垃圾值的 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));

【问题讨论】:

  • 我猜垃圾实际上并不是通过 HTTP 发送的,而是您在读取它时做错了(例如,忽略了 read() 调用的返回值)。向我们展示用于读取它的代码。

标签: java android xml string response


【解决方案1】:

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

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

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

对此最简单的解决方案是直接使用 InputSourceInputStream 它自己:

xr.parse(new InputSource(in));

SAX 解析器已经知道如何处理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();

另请注意,将其转换为 String 并非易事,因为 XML 可能具有任何编码,您需要检测正确的编码才能将 byte[] 正确转换为 String

【讨论】:

    【解决方案2】:

    你必须得到你读了多少字节,然后用这个值截断。

    你也可以得到Content-Length Header 并用它来确定body的长度

    【讨论】:

    • 我正在从 mysql 获取数据。所以长度不能固定...请建议选项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多