0

我对 Android 中的 XML 解析非常困惑。我试图解析这个 xml 链接/文件:[http://93.186.202.34/vertretungsplan.php?api=10d]。我尝试了不同的教程和示例,但示例 xml 的结构不同,我对此非常困惑。我只想在文本视图或没有额外项目窗口的情况下显示数据。有人可以给我一个想法如何解决这个问题,或者用我的链接举个小例子吗?那真是太好了。:D

4

1 回答 1

0

干得好...

public class Vertretungsplan {

public Datum datum;
public List<Eintrag> eintragList;
}


public class Datum {

public String stand;
public String fuer;
public String woche;
}


public class Eintrag {

public String klassen;
public String block;
public String vertreter;
public String fach;
public String raum;
public String fach_orig;
public String lehrer_orig;
public String selbststaendiges_arbeiten;
public String entfall;
public String text;
}


public class SaxHandler extends DefaultHandler {

private Vertretungsplan vertretungsplan;
private List<Eintrag> eintragList;
private Eintrag tempEintrag;
private Datum datum;
private String tempVal;

public SaxHandler() {
    vertretungsplan = new Vertretungsplan();
}

public Vertretungsplan getVertretungsplan() {
    return vertretungsplan;
}

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    tempVal = "";

    if (qName.equalsIgnoreCase("datum")) {
        datum = new Datum();
    }

    if (qName.equalsIgnoreCase("eintraege")) {
        eintragList = new ArrayList<Eintrag>();
    }

    if (qName.equalsIgnoreCase("eintrag")) {
        tempEintrag = new Eintrag();
    }
}

public void characters(char[] ch, int start, int length) throws SAXException {
    tempVal = new String(ch, start, length);
}

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

    if (qName.equalsIgnoreCase("datum")) {
        vertretungsplan.datum = datum;
    } else if (qName.equalsIgnoreCase("stand")) {
        datum.stand = tempVal;
    } else if (qName.equalsIgnoreCase("fuer")) {
        datum.fuer = tempVal;
    } else if (qName.equalsIgnoreCase("woche")) {
        datum.woche = tempVal;
    }

    if (qName.equalsIgnoreCase("eintrag")) {
        eintragList.add(tempEintrag);
    } else if (qName.equalsIgnoreCase("klassen")) {
        tempEintrag.klassen = tempVal;
    } else if (qName.equalsIgnoreCase("block")) {
        tempEintrag.block = tempVal;
    } else if (qName.equalsIgnoreCase("vertreter")) {
        tempEintrag.vertreter = tempVal;
    } else if (qName.equalsIgnoreCase("fach")) {
        tempEintrag.fach = tempVal;
    } else if (qName.equalsIgnoreCase("raum")) {
        tempEintrag.raum = tempVal;
    } else if (qName.equalsIgnoreCase("fach-orig")) {
        tempEintrag.fach_orig = tempVal;
    } else if (qName.equalsIgnoreCase("lehrer-orig")) {
        tempEintrag.lehrer_orig = tempVal;
    } else if (qName.equalsIgnoreCase("selbststaendiges-arbeiten")) {
        tempEintrag.selbststaendiges_arbeiten = tempVal;
    } else if (qName.equalsIgnoreCase("entfall")) {
        tempEintrag.entfall = tempVal;
    } else if (qName.equalsIgnoreCase("text")) {
        tempEintrag.text = tempVal;
    }

    if (qName.equalsIgnoreCase("eintraege")) {
        vertretungsplan.eintragList = eintragList;
    }
}
}


public class SaxParser {
public static Vertretungsplan parse(InputStream is) {
    Vertretungsplan vertretungsplan = null;
    try {
        XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
        SaxHandler saxHandler = new SaxHandler();
        xmlReader.setContentHandler(saxHandler);
        xmlReader.parse(new InputSource(is));
        vertretungsplan = saxHandler.getVertretungsplan();

    } catch (Exception ex) {
        Log.d("XML", "SAXXMLParser: parse() failed");
    }

    return vertretungsplan;
}
}

从您的活动调用中:(以下只是从资产文件夹获取 xml 的示例,您可以使用您喜欢的方式获取输入流并解析它)。

Vertretungsplan vertretungsplan = SaxParser.parse(getAssets().open("test.xml"));

如果您有任何疑问,请告诉我。

于 2014-01-30T18:46:35.173 回答