1

こんにちは、websericesとxml解析は非常に新しいです。http://www.mysamplecode.com/2011/11/android-parse-xml-file-example-using.htmlこのリンクを参照として使用します。しかし、このリンクでは、xmlは単純なものだと思います。このような複雑なxmlを解析するにはどうすればよいですか。これを解析する方法を誰かに提案してもらえますか。各MenuEntryから<A>、<B>、<C>、<D>タグの値を読み取りたい

        <Menu>
         <MenuEntries>

           <MenuEntry>
           <A>--AAAAA---</A>
           <B>--BBBB---</B>
           <MenuEntries/>
           <C>--CCCC---</C>
           <D>--DDDD---</D>
           </MenuEntry>

            <MenuEntry>
            <B>--BBBB---</B>
            <menuEntries/>
            <C>--CCCC---</C>
            <D>--DDDD---</D>
            </MenuEntry>

            <MenuEntry>
            <A>--AAAAA---</A>
            <B>--BBBB---</B>
             <MenuEntries>

                <MenuEntry>
                <A>--AAAAA---</A>
                <B>--BBBB---</B>
                <MenuEntries/>
                <C>--CCCC---</C>
                <D>--DDDD---</D>
                </MenuEntry>

                <MenuEntry>
                <A>--AAAAA---</A>
                <B>--BBBB---</B>
                <MenuEntries/>
                <C>--CCCC---</C>
                <D>--DDDD---</D>
                </MenuEntry>

             </MenuEntries>
           <C>--CCCC---</C>
           <D>--DDDD---</D>
             </MenuEntry>

        <MenuEntry>
        <B>--BBBB---</B>
        <MenuEntries/>
        <C>--CCCC---</C>
        <D>--DDDD---</D>
          </MenuEntry>

        <MenuEntry>
        <A>--AAAAA---</A>
        <B>--BBBB---</B>
        <MenuEntries>

            <MenuEntry>
            <A>--AAAAA---</A>
            <B>--BBBB---</B>
            <MenuEntries/>
            <C>--CCCC---</C>
            <D>--DDDD---</D>
            </MenuEntry>

        </MenuEntries>
        <C>--CCCC---</C>
        <D>--DDDD---</D>
          </MenuEntry>

        </MenuEntries>
        </Menu>

これは、xmlを解析するための私のxmlHandlerクラスです。

    public class ItemXMLHandler extends DefaultHandler {

        Boolean currentElement = false;
        String currentValue = "";
        Menu item = null;
         static ArrayList<Menu> menuList = new ArrayList<Menu>();

        public static ArrayList<Menu> getMenuListz() {

            Log.e("in getMenulist()", String.valueOf(menuList.size()));
            return menuList;
        }

        // Called when tag starts
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {

            currentElement = true;
            currentValue = "";
            if (localName.equals("MenuEntry")) {
                //Log.e("menuENtry found ", "menuENtry found");
                item = new Menu();

            }

        }

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

            currentElement = false;

            /** set value */
            if (localName.equalsIgnoreCase("A")) {
                item.setA(currentValue);
            } else if (localName.equalsIgnoreCase("B")) {
                item.setB(Long.parseLong(currentValue));
            } else if (localName.equalsIgnoreCase("C")) {
                    item.setC(currentValue);
            } else if (localName.equalsIgnoreCase("menuEntry"))

                menuList.add(item);

        }

        // Called to get tag characters
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {

            if (currentElement) {
                currentValue = currentValue + new String(ch, start, length);
            }

        }

    }

これはMenuの私のJavaクラスです

    public Class Menu{
        private long B;
        private String A;
        private String C;

        public long getB() {
            return B;
        }
        public void setB(long B){
            this.B = B;
        }
        public String getA() {
            return A
        }
        public void setA(String A){
            this.A = A
        }
        public String getC() {
            return C
        }
        public void setC(String C) {
            this.C = C;
        }
    }

重複とnull値を取得しています。コーディングが間違っている可能性があることを知っています。この種の複雑なxml(私にとってはその複雑な:))を解析するための返信や便利なリンクを誰かが助けてくれますか?

4

2 に答える 2

1

元のXMLファイルを見ると、問題は、選択したサンプルコードがXMLデータのネストがないと想定していることです。したがって、ここでのコード行は次のとおりです。

        if (localName.equals("MenuEntry")) {
            //Log.e("menuENtry found ", "menuENtry found");
            item = new Menu();
        }

アウター<MenuEntry> ... <MenuEntries> ...<MenuEntry>の保留のようなシーケンスとして遭遇すると、上書きされることを意味します。迅速で汚い(そしてテストされていない!)解決策の1つは次のとおりです。itemMenuEntry

public class ItemXMLHandler extends DefaultHandler {

    Boolean currentElement = false;
    String currentValue = "";
    /*DELETE Menu item = null; */
    static ArrayList<Menu> menuList = new ArrayList<Menu>();

    /*NEW*/ Stack<Menu> items;

    public static ArrayList<Menu> getMenuListz() {

        Log.e("in getMenulist()", String.valueOf(menuList.size()));
        return menuList;
    }

    // Called when tag starts
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {

        currentElement = true;
        currentValue = "";
        if (localName.equals("MenuEntry")) {
            //Log.e("menuENtry found ", "menuENtry found");
            /*UPDATE*/ items.push(new Menu());

        }

    }

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

        currentElement = false;
        /*NEW*/ Menu item = items.peek();
        /** set value */
        if (localName.equalsIgnoreCase("A")) {
            item.setA(currentValue);
        } else if (localName.equalsIgnoreCase("B")) {
            item.setB(Long.parseLong(currentValue));
        } else if (localName.equalsIgnoreCase("C")) {
                item.setC(currentValue);
        } else if (localName.equalsIgnoreCase("menuEntry"))
            /*NEW*/ items.pop();
            menuList.add(item);
    }

    // Called to get tag characters
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {

        if (currentElement) {
            currentValue = currentValue + new String(ch, start, length);
        }
    }
}

これにより、保留中のMenu構造のスタックが維持されます。

于 2012-08-21T06:44:21.023 に答える
1

http://simple.sourceforge.net/ は、このxmlの解析に役立ちました

于 2012-11-15T08:02:50.397 に答える