的Andr​​oid的SAXParser,解析到数组,并得到子节点 [英] Android SAXParser, parse into array and get child nodes

查看:181
本文介绍了的Andr​​oid的SAXParser,解析到数组,并得到子节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用一个小的应用程序和XML文件打印章节的ArrayList这又指向一个特定的HTML文件。

我用这个教程让我开始:<一href=\"http://www.anddev.org/novice-tutorials-f8/parsing-xml-from-the-net-using-the-saxparser-t353.html\" rel=\"nofollow\">http://www.anddev.org/novice-tutorials-f8/parsing-xml-from-the-net-using-the-saxparser-t353.html

我的xml文件看起来是这样的:

 &LT;&章GT;
    &LT;章节标题=Förutsättningar&GT;
        &LT;页面标题=思达3URL =sida_3.html/&GT;
        &LT;页面标题=思达4URL =sida_4.html/&GT;
    &LT; /章节&GT;
&LT; /章节&GT;

使用上面的教程我已经成功地输出每章节点与在每个项目上onListItemClick功能的ArrayList。到目前为止好。

我遇到的问题是,我无法弄清楚如何获得特定的子节点,并加载HTML文件时,我点击一个项目。我是pretty新到Android。

任何想法?我真的AP preciate任何关于这个问题的帮助。

下面是我的源代码:

ParsingXML.java

 公共类ParsingXML扩展ListActivity {
私人最终字符串MY_DEBUG_TAG =XmlParser的;
公共字符串LANG = NULL;@覆盖
公共无效的onCreate(捆绑冰柱){
    super.onCreate(冰柱);
    的setTitle(Lastsäkring);    束束= this.getIntent()getExtras()。
    LANG = bundle.getString(郎);    Log.i(ParsingXML,选择的语言:+ this.lang +,类型:。+ this.lang.getClass()的getName());    TextView的电视=新的TextView(本);    尝试{
        SPF SAXParserFactory的= SAXParserFactory.newInstance();
        的SAXParser SP = spf.newSAXParser();        XMLReader的XR = sp.getXMLReader();        ExampleHandler myExampleHandler =新ExampleHandler();
        xr.setContentHandler(myExampleHandler);        / *
         *如果XML文件位于网络(互联网需要的权限清单):
         *网址URL =新的URL(http://dev.houdini.se/android/demo.xml);
         * xr.parse(新的InputSource(url.openStream()));
         * /        如果(this.lang.equals(EN))
            xr.parse(新的InputSource(this.getResources()openRawResource(R.raw.en_content)));
        其他
            xr.parse(新的InputSource(this.getResources()openRawResource(R.raw.sv_content)));        ParsedExampleDataSet parsedExampleDataSet = myExampleHandler.getParsedData();
        this.setListAdapter(新ArrayAdapter&所述;字符串&GT;(此,android.R.layout.simple_list_item_1,parsedExampleDataSet.toArrayList()));    }赶上(例外五){
        tv.setText(错误:+ e.getMessage());
        Log.e(MY_DEBUG_TAG,XmlParseError,E);
        this.setContentView(电视);
    }
}保护无效onListItemClick(ListView中升,视图V,INT位置,长的id){
    super.onListItemClick(L,V,位置ID);
    上下文的背景下= getApplicationContext();
    INT持续时间= Toast.LENGTH_SHORT;    CharSequence的文字=点击位置:+位置+,ID:+ ID;
    吐司面包= Toast.makeText(背景,文本,持续时间);
    toast.show();
    / *开关(位置)
    {
       情况下0:
                束束=新包();
                bundle.putString(WINDOWTITLE,种皮);
                意向意图=新意图(这一点,TextPage.class);
                intent.putExtras(包);
                startActivity(意向);
                打破;
       情况1:
            意图视频=新意图(这一点,Video.class);
            startActivity(视频)
           打破;       案例2:
            意图刷卡=新意图(这一点,Swipe.class);
            startActivity(刷卡);
          打破;
    } * /
}公共布尔onCreateOptionsMenu(菜单菜单){
    MenuInflater吹气= getMenuInflater();
    inflater.inflate(R.menu.options_menu,菜单);
    返回true;
}@覆盖
公共布尔onOptionsItemSelected(菜单项项){
    //处理项目选择
    开关(item.getItemId()){
        案例R.id.settings:
            意向prefsActivity =新意图(getBaseContext(),preferences.class);
            startActivity(prefsActivity);
            返回true;
        默认:
            返回super.onOptionsItemSelected(项目);
    }
}
}

ExampleHandler.java

 公共类ExampleHandler扩展的DefaultHandler {
私人布尔in_chapters = FALSE;
私人布尔in_chapter = FALSE;
私人布尔IN_PAGE = FALSE;私人ParsedExampleDataSet myParsedExampleDataSet =新ParsedExampleDataSet();公共ParsedExampleDataSet getParsedData(){
    返回this.myParsedExampleDataSet;
}@覆盖
公共无效startDocument()抛出的SAXException {
    this.myParsedExampleDataSet =新ParsedExampleDataSet();
}@覆盖
公共无效调用endDocument()抛出的SAXException {
    // 没事做
}@覆盖
公共无效的startElement(字符串的namespaceURI,字符串的localName,字符串QNAME,属性的ATT)抛出的SAXException {
    如果(localName.equals(章)){
        this.in_chapters = TRUE;
    }否则如果(localName.equals(章)){
        this.in_chapter = TRUE;
        字符串attrValue = atts.getValue(标题);
        myParsedExampleDataSet.setExtractedString(attrValue);
    }否则如果(localName.equals(页)){
        this.in_page =真;
    }
}@覆盖
公共无效的endElement(字符串的namespaceURI,字符串的localName,字符串QNAME)抛出的SAXException {
    如果(localName.equals(章)){
        this.in_chapters = FALSE;
    }否则如果(localName.equals(章)){
        this.in_chapter = FALSE;
    }否则如果(localName.equals(页)){
        this.in_page = FALSE;
    }
}@覆盖
公共无效字符(字符CH [],诠释开始,诠释长度){
    如果(this.in_page ==真){
        myParsedExampleDataSet.setExtractedString(新的String(CH,开始位置,长度));
    }
}}

ParsedExampleDataSet.java

 公共类ParsedExampleDataSet {
私人字符串extractedString =;
私人的ArrayList&LT;串GT; myArr,该=新的ArrayList&LT;串GT;();
私人INT extractedInt = 0;公众的ArrayList&LT;串GT; getExtractedString(){
    //返回extractedString;功能类型=字符串
    返回myArr,该;
}公共无效setExtractedString(字符串extractedString){
    //this.extractedString + = extractedString +\\ n;
    myArr.add(extractedString);
}公众诠释getExtractedInt(){
    返回extractedInt;
}公共无效setExtractedInt(INT extractedInt){
    this.extractedInt = extractedInt;
}公共字符串的toString(){
    回归NODER \\ n+ this.extractedString;
}公众的ArrayList&LT;串GT; toArrayList(){
    返回this.myArr;
}
}


解决方案

首先建立正确的数据结构:

 公共类PageNode {
    公共字符串称号;
    公共字符串的URL;
    / *吸气剂/ setter方法​​/构造等,如果你喜欢* /
    公共字符串的toString(){
       返回称号;
    }
}公共类ChapterNode {
    公共字符串称号;
    公众的ArrayList&LT; PageNode&GT;页=新的ArrayList&LT; PageNode&GT;();
    / *吸气剂/ setter方法​​/构造等,如果你喜欢* /
}

和相应的解析XML。例如:

 的ArrayList&LT; ChapterNode&GT;章=新的ArrayList&LT; ChapterNode&GT;();
ChapterNode chapterNode = NULL;公共无效的startElement(字符串的namespaceURI,字符串的localName,字符串QNAME,属性的ATT)抛出的SAXException {
    如果(localName.equals(章)){
    }否则如果(localName.equals(章)){
        chapterNode =新ChapterNode();
        chapterNode.title = atts.getValue(标题);
    }否则如果(localName.equals(页)){
        PageNode pageNode =新PageNode();
        pageNode.title = atts.getValue(标题);
        pageNode.url = atts.getValue(URL);
        chapterNode.pages.add(pageNode);
    }
}@覆盖
公共无效的endElement(字符串的namespaceURI,字符串的localName,字符串QNAME)抛出的SAXException {
    如果(localName.equals(章)){
    }否则如果(localName.equals(章)){
        chapters.add(chapterNode);
        chapterNode = NULL;
    }否则如果(localName.equals(页)){
    }
}

然后就可以访问pageNode是这样的:

  PageNode pageNode = chapterNode.pages.get(位置);

和设置适配器是这样的:

  this.setListAdapter(新ArrayAdapter&LT;串GT;(这一点,android.R.layout.simple_list_item_1,chapterNode.pages));

I'm working on a small app that uses and xml file to print an ArrayList of chapters which in turn points to a specific html file.

I used this tutorial to get me started: http://www.anddev.org/novice-tutorials-f8/parsing-xml-from-the-net-using-the-saxparser-t353.html

My xml file looks something like this:

<chapters>
    <chapter title="Förutsättningar">
        <page title="Sida 3" url="sida_3.html" />
        <page title="Sida 4" url="sida_4.html" />
    </chapter>
</chapters>

Using the tutorial above I've managed to output each chapter node into an ArrayList with a onListItemClick function on each item. So far so good.

The problem I'm having is that I can't figure out how to get a specific child node and load the html file when I click an item. I'm pretty new to Android.

Any ideas? I would really appreciate ANY help on the subject.

Here's my source:

ParsingXML.java

public class ParsingXML extends ListActivity {
private final String MY_DEBUG_TAG = "XmlParser";
public String lang = null;

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setTitle("Lastsäkring");

    Bundle bundle = this.getIntent().getExtras();
    lang = bundle.getString("lang");

    Log.i("ParsingXML", "Chosen language: " + this.lang + ", Type: " + this.lang.getClass().getName());

    TextView tv = new TextView(this);

    try {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();

        XMLReader xr = sp.getXMLReader();

        ExampleHandler myExampleHandler = new ExampleHandler();
        xr.setContentHandler(myExampleHandler);

        /*
         * If XML-file is located online (needs internet permissions in the manifest):
         * URL url = new URL("http://dev.houdini.se/android/demo.xml");
         * xr.parse(new InputSource(url.openStream()));
         */

        if(this.lang.equals("en"))
            xr.parse(new InputSource(this.getResources().openRawResource(R.raw.en_content)));
        else
            xr.parse(new InputSource(this.getResources().openRawResource(R.raw.sv_content)));

        ParsedExampleDataSet parsedExampleDataSet = myExampleHandler.getParsedData();                       
        this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, parsedExampleDataSet.toArrayList()));

    } catch(Exception e) {
        tv.setText("Error: " + e.getMessage());
        Log.e(MY_DEBUG_TAG, "XmlParseError", e);
        this.setContentView(tv);
    }
}

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Context context = getApplicationContext();
    int duration = Toast.LENGTH_SHORT;

    CharSequence text = "Clicked position: " + position + ", id: " + id;
    Toast toast = Toast.makeText(context, text, duration);
    toast.show();


    /*switch( position )
    {
       case 0:                                  
                Bundle bundle = new Bundle();
                bundle.putString("WindowTitle", "TESTA");
                Intent intent = new Intent(this, TextPage.class);
                intent.putExtras(bundle);
                startActivity(intent);
                break;                  
       case 1:  
            Intent video = new Intent(this, Video.class);
            startActivity(video);
           break;

       case 2:  
            Intent swipe = new Intent(this, Swipe.class);
            startActivity(swipe);
          break;
    }*/
}

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
        case R.id.settings:
            Intent prefsActivity = new Intent(getBaseContext(), Preferences.class);
            startActivity(prefsActivity);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
}

ExampleHandler.java

public class ExampleHandler extends DefaultHandler {
private boolean in_chapters = false;
private boolean in_chapter = false;
private boolean in_page = false;

private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet();

public ParsedExampleDataSet getParsedData() {
    return this.myParsedExampleDataSet;
}

@Override
public void startDocument() throws SAXException {
    this.myParsedExampleDataSet = new ParsedExampleDataSet();
}

@Override
public void endDocument() throws SAXException {
    // Nothing to do
}

@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
    if(localName.equals("chapters")) {
        this.in_chapters = true;
    } else if(localName.equals("chapter")) {
        this.in_chapter = true;
        String attrValue = atts.getValue("title");
        myParsedExampleDataSet.setExtractedString(attrValue);
    } else if(localName.equals("page")) {
        this.in_page = true;
    }
}

@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
    if(localName.equals("chapters")) {
        this.in_chapters = false;
    } else if(localName.equals("chapter")) {
        this.in_chapter = false;
    } else if(localName.equals("page")) {
        this.in_page = false;
    }
}

@Override
public void characters(char ch[], int start, int length) {
    if(this.in_page == true) {
        myParsedExampleDataSet.setExtractedString(new String(ch, start, length));
    }
}

}

ParsedExampleDataSet.java

public class ParsedExampleDataSet {
private String extractedString = "";
private ArrayList<String> myArr = new ArrayList<String>();
private int extractedInt = 0;

public ArrayList<String> getExtractedString() {
    //return extractedString; Function Type = String
    return myArr;
}

public void setExtractedString(String extractedString) {
    //this.extractedString += extractedString + "\n";
    myArr.add(extractedString);
}

public int getExtractedInt() {
    return extractedInt;
}

public void setExtractedInt(int extractedInt) {
    this.extractedInt = extractedInt;
}

public String toString() {
    return "NODER\n" + this.extractedString;
}

public ArrayList<String> toArrayList() {
    return this.myArr;
}
}

解决方案

First create proper data structure:

public class PageNode {
    public String title;
    public String url;
    /* Getters/setter/constructor etc. if you feel like*/
    public String toString() {
       return title;
    }
}

public class ChapterNode {
    public String title;
    public ArrayList<PageNode> pages = new ArrayList<PageNode>();
    /* Getters/setter/constructor etc. if you feel like*/
}

And parse the xml accordingly. Example:

ArrayList<ChapterNode> chapters = new ArrayList<ChapterNode>();
ChapterNode chapterNode = null;

public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
    if(localName.equals("chapters")) {
    } else if(localName.equals("chapter")) {
        chapterNode = new ChapterNode();
        chapterNode.title = atts.getValue("title");
    } else if(localName.equals("page")) {
        PageNode pageNode = new PageNode();
        pageNode.title = atts.getValue("title");
        pageNode.url = atts.getValue("url");
        chapterNode.pages.add(pageNode);
    }
}

@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
    if(localName.equals("chapters")) {
    } else if(localName.equals("chapter")) {
        chapters.add(chapterNode);
        chapterNode = null;
    } else if(localName.equals("page")) {
    }
}

Then you can access the pageNode like this:

PageNode pageNode = chapterNode.pages.get(position);

And set adapter like this:

this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, chapterNode.pages));

这篇关于的Andr​​oid的SAXParser,解析到数组,并得到子节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆