Проблема решена!
Ниже приведены сайты с полезной информацией:
Моя первоначальная проблема заключалась в том, как определить класс для данных, которые я хотел извлечь из XML.После того, как я понял, как мне следует это сделать (пересмотрев основные концепции программирования на JAVA), я изменил тип данных, возвращаемых ExampleHandler, на ArrayList <"класс данных, которые вы хотите вернуть">.
Ниже приведен пример:
Пример XML, который вы хотите проанализировать:
<outertag>
<cartag type="Audi">
<itemtag name="model">A4</itemtag>
<itemtag name="color">Black</itemtag>
<itemtag name="year">2005</itemtag>
</cartag>
<cartag type="Honda">
<itemtag name="model">Civic</itemtag>
<itemtag name="color">Red</itemtag>
<itemtag name="year">2001</itemtag>
</cartag>
<cartag type="Seat">
<itemtag name="model">Leon</itemtag>
<itemtag name="color">White</itemtag>
<itemtag name="year">2009</itemtag>
</cartag>
</outertag>
Так что здесь вы должны определить класс "car "с надлежащими атрибутами (тип String, модель, цвет, год;), сеттеры и геттеры ...
- Я предлагаю ExampleHandler для этого XML:
открытый класс ExampleHandler extends DefaultHandler {
// ===========================================================
// Fields
// ===========================================================
private int numberOfItems=3;
private boolean in_outertag = false;
private boolean in_cartag = false;
private boolean[] in_itemtag = new boolean[numberOfItems];
Car newCar = new Car();
private ArrayList<Car> list = new ArrayList<Car>();
// ===========================================================
// Getter & Setter
// ===========================================================
public ArrayList<Car> getParsedData() {
return this.list;
}
// ===========================================================
// Methods
// ===========================================================
@Override
public void startDocument() throws SAXException {
this.list = new ArrayList<Car>();
}
@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 {
if (localName.equals("outertag")) {
this.in_outertag = true;
}else if (localName.equals("cartag")) {
this.in_cartag = true;
newCar.setType(atts.getValue("type")); //setType(...) is the setter defined in car class
}else if (localName.equals("itemtag")) {
if((atts.getValue("name")).equals("model")){
this.in_itemtag[0] = true;
}else if((atts.getValue("name")).equals("color")){
this.in_itemtag[1] = true;
}else if((atts.getValue("name")).equals("year")){
this.in_itemtag[2] = true;
}
}
}
/** Gets be called on closing tags like:
* </tag> */
@Override
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {
if (localName.equals("outertag")) {
this.in_outertag = false;
}else if (localName.equals("cartag")) {
this.in_cartag = false;
Car carTemp = new Car();
carTemp.copy(newCar, carTemp); //this method is defined on car class, and is used to copy the
//properties of the car to another Object car to be added to the list
list.add(carTemp);
}else if (localName.equals("itemtag")){
if(in_itemtag[0]){
this.in_itemtag[0] = false;
}else if(in_itemtag[1]){
this.in_itemtag[1] = false;
}else if(in_itemtag[2]){
this.in_itemtag[2] = false;
}
}
}
/** Gets be called on the following structure:
* <tag>characters</tag> */
@Override
public void characters(char ch[], int start, int length) {
if(in_itemtag[0]){
newCar.setModel(new String(ch, start, length));
}else if(in_itemtag[1]){
newCar.setColor(new String(ch, start, length));
}else if(in_itemtag[2]){
newCar.setYear(new String(ch, start, length));
}
}
}
После этого вы можете получить проанализированные данные в Activity, используя:
...
ArrayList<Car> ParsedData = myExampleHandler.getParsedData();
...
Надеюсь, это кому-нибудь поможет.
Внимание: я не тестировал точно так, как это, но это почти то же самое, что и мое решение, поэтому оно должно работать ...
И извините за мой плохой английский ...