im, работающий над android и получая ответ от http my xml code, содержит много значений для мусора в конце tahe. Как удалить этот мусор... пожалуйста, предложите
моя строка xml с размером мусора
<player><id>1</id><name>sachin</name><value>98</value></player>ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
вот код, где im создает массив и возвращает его значения
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));
Как я и ожидал. В этом коде:
byte[] bData = new byte[1024];
in.read(bData);
System.out.println("In Data"+in.toString());
String st=new String (bData);
Вы читаете текст, а затем преобразовываете целое byte[]
в String
, даже если вы не заполнили весь byte[]
с помощью read
-call. Кроме того, вы игнорируете, есть ли больше данных (т.е. Если ваш контент превышает 1024 байта).
Простейшим решением для этого является использование InputSource
с InputStream
it self непосредственно:
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
.
вы должны получить, сколько байтов вы прочитали, а затем обрезать с этим значением.
Также вы можете получить заголовок Content-Length
и использовать его для определения длины тела
read()
). Покажите нам код, используемый для чтения этого.