#android #xml #arraylist #saxparser
#Android #xml #список массивов #saxparser
Вопрос:
Я пытаюсь проанализировать XML-страницу, которая построена следующим образом: http://pastebin.com/t9cXdnGs . Я внедрил базовый синтаксический анализатор SAX, следуя этому руководству: Anddev SAX tutorial.
Это сработало довольно хорошо, за исключением того, что я получаю значения только последнего тега. Чтобы решить это, я реализовал ArrayList для добавления каждого созданного объекта на узел XML. Но теперь я получаю какой-то странный вывод. Для каждого узла, который он передает в цикле, он снова добавляет то же значение. Итак, для узла 1 я получаю значение один раз, для узла 2 я получаю значение дважды и так далее… (пример: значение 1, значение 2value2, значение 3value3value3)
Кажется, я не могу понять, что не так…
Вот мой полный исходный код страницы:http://pastebin.com/bkyz0g1U
Ответ №1:
Вы повторно используете один и тот же объект снова и снова, поэтому вы добавляете только один объект в свой ArrayList
. Замените эту строку:
private Vacature vacature = new Vacature();
с
private Vacature vacature;
и добавьте эту строку:
vacature = new Vacature();
сразу после вашего объявления characters()
метода:
public void characters(char ch[], int start, int length) {
Я также подозреваю, что это getVacatures()
должно вернуть ArrayList
arrayVaca
.
Ответ №2:
Я быстро изменил ваш код на более простое решение:
package stage.accent.webservice;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import stage.accent.domain.Vacature;
public class vacatureWebservice extends DefaultHandler {
private ArrayList<Vacature>arrayVaca = new ArrayList<Vacature>();
private Vacature vacature = null;
public ArrayList<Vacature> getVacatures() {
return this.arrayVaca;
}
public StringBuilder buff = new StringBuilder();
@Override
public void startDocument() throws SAXException {
this.vacature = new Vacature();
}
@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 {
}
/** Gets be called on closing tags like:
* </tag> */
@Override
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {
if (localName.equals("vacatures")) {
}else if (localName.equals("vacature")) {
}else if (localName.equals("titel")) {
vacature.setTitel(buff.toString());
}else if (localName.equals("werkveld")){
vacature.setWerkveld(buff.toString());
}else if (localName.equals("regio")){
vacature.setRegio(buff.toString());
arrayVaca.add(vacature);
vacature = new Vacature();
}
buff = new StringBuilder();
}
/** Gets be called on the following structure:
* <tag>characters</tag> */
@Override
public void characters(char ch[], int start, int length) {
if (buff!=null) {
for (int i=start; i<start length; i ) {
buff.append(ch[i]);
}
}
}
}