0

アプリケーションを動的に作成したいプロジェクトに取り組んでいます。

すべてのテンプレートが定義されているxmlファイルを操作してこれを行いたいので、それらを解析してテンプレートに適用できます。

しかし、xmlPullParser について質問があります。多くのタグと属性があると、解析コードが難しく、大きくて醜いように見えます。

これを行うより良い方法はありますか?

これは、私が現在例として使用している xml です。

    <?xml version="1.0" encoding="UTF-8"?>
<app>
    <template type="chapter">
        <background>#10c1c5</background>
        <number color="#ffffff">01</number>
        <maxnumber color="#ffffff">07</maxnumber>
        <title color="#ffffff">Het Verhaal</title>
    </template>
    <template type="chapter">
        <background>#10c1c5</background>
        <number color="#ffffff">02</number>
        <maxnumber color="#ffffff">07</maxnumber>
        <title color="#ffffff">De Bruul</title>
    </template>
    <template type="chapter">
        <background>#10c1c5</background>
        <number color="#ffffff">03</number>
        <maxnumber color="#ffffff">07</maxnumber>
        <title color="#ffffff">Grote markt</title>
    </template>
    <template type="chapter">
        <background>#10c1c5</background>
        <number color="#ffffff">04</number>
        <maxnumber color="#ffffff">07</maxnumber>
        <title color="#ffffff">De Sint-Romboutstoren</title>
    </template>
    <template type="chapter">
        <background>#10c1c5</background>
        <number color="#ffffff">05</number>
        <maxnumber color="#ffffff">07</maxnumber>
        <title color="#ffffff">De Vismarkt</title>
    </template>
    <template type="chapter">
        <background>#10c1c5</background>
        <number color="#ffffff">06</number>
        <maxnumber color="#ffffff">07</maxnumber>
        <title color="#ffffff">Hanswijk</title>
    </template>
    <template type="chapter">
        <background>#10c1c5</background>
        <number color="#ffffff">07</number>
        <maxnumber color="#ffffff">07</maxnumber>
        <title color="#ffffff">De Vest</title>
    </template>


<template type="route">
    <text>Ga 150 meter verder</text>
    <background>#003e79</background>
</template>
<template type="route">
    <text>Ga 550 meter verder</text>
    <background>#0000FF</background>
</template>
<template type="route">
    <text>Ga 850 meter verder</text>
    <background>#00FF00</background>
</template>
</app>

これは、それを解析し、適切なオブジェクトを作成し、色とテキストを設定する醜いコードです。

public List<Fragment> parse() {
        // parse de xml plaats de objecten in de list en return de list

        try {

            factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(false); // use namespace ?
            xpp = factory.newPullParser();
            // xmluit file laden
            String file = "assets/test.xml";
            InputStream in = this.getClass().getClassLoader()
                    .getResourceAsStream(file);
            xpp.setInput(in, null);

            int eventType = xpp.getEventType();

            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tagname = xpp.getName(); // tag naam
                String atType = xpp.getAttributeValue(null, "type"); // atrribuut
                                                                        // type
                String atColor = xpp.getAttributeValue(null, "color");

                switch (eventType) {
                case XmlPullParser.START_TAG:
                    if (tagname.equalsIgnoreCase("template")) {
                        if (atType.equalsIgnoreCase("route")) {
                            // fragments.add(new RouteFragment()); //nieuw
                            // routefragment toevoegen aan de lijst
                            route = new RouteFragment();
                            typeObject = "route";
                        } else if (atType.equalsIgnoreCase("chapter")) {
                            // fragments.add(new chapterFragment()); //nieuw
                            // chapterfragment toevoegen aan de lijst
                            chapter = new ChapterFragment();
                            typeObject = "chapter";
                        }

                    } else if (tagname.equalsIgnoreCase("number")) {
                        if (typeObject.equalsIgnoreCase("chapter")) {
                            chapter.setNumberTextcolor(atColor);
                        }
                    } else if (tagname.equalsIgnoreCase("maxnumber")) {
                        if (typeObject.equalsIgnoreCase("chapter")) {
                            chapter.setMaxNumberColor(atColor);
                        }
                    } else if (tagname.equalsIgnoreCase("title")) {
                        if (typeObject.equalsIgnoreCase("chapter")) {
                            chapter.setTitleColor(atColor);
                        }
                    }
                    break;

                case XmlPullParser.TEXT:
                    text = xpp.getText();
                    break;

                case XmlPullParser.END_TAG:
                    if (tagname.equalsIgnoreCase("template")) {
                        if (typeObject.equalsIgnoreCase("route")) {
                            fragments.add(route); // nieuw routefragment
                                                    // toevoegen aan de lijst

                        }
                        if (typeObject.equalsIgnoreCase("chapter")) {
                            fragments.add(chapter); // nieuw chapterfragment
                                                    // toevoegen aan de lijst
                        }
                    } else if (tagname.equalsIgnoreCase("text")) {
                        if (typeObject.equalsIgnoreCase("route")) {
                            route.setOmschrijving(text);
                        }
                    } else if (tagname.equalsIgnoreCase("background")) {
                        if (typeObject.equalsIgnoreCase("route")) {
                            route.setKleur(text);
                        } else if (typeObject.equalsIgnoreCase("chapter")) {
                            chapter.setBackgroundColor(text);
                        }
                    } else if (tagname.equalsIgnoreCase("number")) {
                        if (typeObject.equalsIgnoreCase("chapter")) {
                            chapter.setNumber(text);
                        }
                    } else if (tagname.equalsIgnoreCase("maxnumber")) {
                        if (typeObject.equalsIgnoreCase("chapter")) {
                            chapter.setMaxNumber(text);
                        }
                    } else if (tagname.equalsIgnoreCase("title")) {
                        if (typeObject.equalsIgnoreCase("chapter")) {
                            chapter.setTitle(text);
                        }
                    }
                    break;
                default:
                    break;

                }
                eventType = xpp.next();
            }

        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return fragments;

    }
4

2 に答える 2

0

よりエレガントで読みやすいように見えるブール値を使用することをお勧めします...次のサンプルは、ニューヨークタイムズのxmlを解析し、アイテムタグからタイトルコンテンツを取得するためのものです。何らかの形で役立つことを願っています.. .

public class MainActivity extends Activity {
boolean item;
boolean title;
String titleContent;
String tagName;
String childrens="";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Resources res = getResources();
    try
    {
        XmlPullParser parser = res.getXml(R.xml.wallarss);
        int eventType = parser.getEventType();
        while(eventType!=XmlPullParser.END_DOCUMENT)
        {
            if(eventType==XmlPullParser.START_TAG)
            {   
                tagName=parser.getName();

                if(item)
                {
                    if(tagName.equals("title"))
                    {
                        title=true;
                    }

                }
                else//!item
                {
                    if(tagName.equals("item"))
                        item=true;
                }
                if(eventType==XmlPullParser.END_TAG)
                {
                    tagName=parser.getName();
                    if(tagName.equals("item"))
                        item=false;
                }

            }
                if(eventType==XmlPullParser.TEXT)
                {
                    if(title)
                    {
                        String artical=parser.getText();
                        Log.i("news",artical);
                        title=false;
                    }
                    eventType=XmlPullParser.START_TAG;
                }


            eventType=parser.next();
        }
    }

    catch(XmlPullParserException ex)
    {
        Log.e("Xml reader problem", "canot read xml file", ex);
    }
    catch(IOException ex)
    {
        Log.e("I/O problem", "Input/Output Erorr", ex);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

于 2014-01-29T19:12:18.367 に答える