0

Sax パーサーで複数の文字列タグの連結に問題があります。私のXmlデータは(巨大なリスト)のように見えます..

<Table diffgr:id="Table1" msdata:rowOrder="0">
<ID>213</ID>
<LastName>Sirk</LastName>
<FirstName>Thomas</FirstName>
<Height>6 ft 4 inches</Height>
<HomeTown>Glen St. Mary's</HomeTown>
<TeamName>Blue Devils</TeamName>
<Age>19</Age>
<FullName>1 Thomas Sirk</FullName>
</Table>

<Table diffgr:id="Table2" msdata:rowOrder="1">
<ID>17</ID>
<LastName>Vernon</LastName>
<FirstName>Conner</FirstName>
<Height>6 ft 1 inches</Height>
<HomeTown>Miami Fl</HomeTown>
<TeamName>Blue Devils</TeamName>
<Age>22</Age>
<FullName>2 Conner Vernon</FullName>
 </Table>

<Table diffgr:id="Table3" msdata:rowOrder="2">
<ID>203</ID>
<LastName>Crowder</LastName>
<FirstName>Jamison</FirstName>
<Height>5 ft 9 inches</Height>
<HomeTown>Monroe NC</HomeTown>
<TeamName>Blue Devils</TeamName>
<Age>19</Age>
<FullName>3 Jamison Crowder</FullName>
 </Table>

このコードをこのようなハンドラで使用しました。

class MyHandler extends DefaultHandler{

            boolean is_sno=false;
        boolean is_sname=false;
        boolean is_sclass=false;
        boolean is_sphno=false;
        boolean is_semail=false;
        boolean mIsSegment = false;
        int mCurrentIndex = -1;

            @Override
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            super.startDocument();
        }

        @Override
        public void startElement(String uri, String localName, String name,
                Attributes attributes) throws SAXException {
            super.startElement(uri, localName, name, attributes);

             if (localName.equals("Table")) {
                    mCurrentIndex++;
                    al_sno.add("");
                    al_sname.add("");
                    al_sclass.add("");
                            al_sphno.add("");
                            al_semail.add("");
                }

             else if(localName.equals("ID")){
                is_sno=true;
            }
            else if(localName.equals("TeamName")){
                is_sname=true;
            }
            else if(localName.equals("Fullname")){
                is_sclass=true;
            }
            /*else if(localName.equals("HomeTown")){
                is_sphno=true;
            }
            else if(localName.equals("Height")){
                is_semail=true;
            }*/
        }

        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            // TODO Auto-generated method stub
            super.characters(ch, start, length);
            if(is_sno){
                 al_sno.set(mCurrentIndex, new String(ch, start, length));
            }
            else if (is_sname) {
                if (!mIsSegment) {
                    al_sname.set(mCurrentIndex, new String(ch, start, length));
                } else {
                    al_sname.set(mCurrentIndex,
                            al_sname.get(al_sname.size() - 1)
                                    + new String(ch, start, length));
                }
                mIsSegment = true;
            }
            else if(is_sclass){

            if (!mIsSegment) {
                al_sclass.set(mCurrentIndex, new String(ch, start, length));
            } else {
                al_sclass.set(mCurrentIndex,
                        al_sclass.get(al_sclass.size() - 1)
                                + new String(ch, start, length));
            }
            mIsSegment = true;
            }

        else if(is_sphno){
            if (!mIsSegment) {
                al_sphno.set(mCurrentIndex, new String(ch, start, length));
            } else {
                al_sphno.set(mCurrentIndex,
                        al_sphno.get(al_sphno.size() - 1)
                                + new String(ch, start, length));
            }
            mIsSegment = true;}
        }
        else if(is_semail){
            if (!mIsSegment) {
                al_semail.set(mCurrentIndex, new String(ch, start, length));
            } else {
                al_semail.set(mCurrentIndex,
                        al_semail.get(al_semail.size() - 1)
                                + new String(ch, start, length));
            }
            mIsSegment = true;}

        }
        }

        @Override
        public void endElement(String uri, String localName, String name)
                throws SAXException {
            // TODO Auto-generated method stub
            super.endElement(uri, localName, name);

            if(localName.equals("ID")){
                is_sno=false;
            }
            else if(localName.equals("TeamName")){
                is_sname=false;
                 mIsSegment = false;
            }
            else if(localName.equals("Fullname")){
                is_sclass=false;
                            mIsSegment = false;
            }
            else if(localName.equals("HomeTown")){
                is_sphno=false;
                           mIsSegment = false;
            }
            else if(localName.equals("Height")){
                is_semail=false;
                             mIsSegment = false;
            }
        }

        @Override
        public void endDocument() throws SAXException {
            // TODO Auto-generated method stub
            super.endDocument();
        }


    }

チームのプレーヤーリストを 1 ページに表示しようとしていますが、ほとんどの文字列が Height、HomeTown、Fullname、TeamName の連結の問題を抱えています。ここでいくつかのコードに従いました。複数の文字列ではなく、単一の文字列で正常に機能します。私を助けてください。

4

1 に答える 1

2

のハンドラを書き直しましたSaxParser:

// the Lists of data 
ArrayList<String> mIdList = new ArrayList<String>();
ArrayList<String> mLastNameList = new ArrayList<String>();
ArrayList<String> mFirstNameList = new ArrayList<String>();
ArrayList<String> mHeightList = new ArrayList<String>();
ArrayList<String> mHomeTownList = new ArrayList<String>();
ArrayList<String> mTeamNameList = new ArrayList<String>();
ArrayList<String> mAgeList = new ArrayList<String>();
ArrayList<String> mFullNameList = new ArrayList<String>();

MyHandlerクラス:

class MyHandler extends DefaultHandler {

    private boolean isIDTag = false;
    boolean isLastNameTag = false;
    boolean isFirstNameTag = false;
    boolean isHeightTag = false;
    boolean isHomeTownTag = false;
    boolean isTeamNameTag = false;
    boolean isAgeTag = false;
    boolean isFullNameTag = false;
    boolean mIsSegment = false;
    private int mCurrentIndex = -1;

    @Override
    public void startElement(String uri, String localName, String name,
            Attributes attributes) throws SAXException {
        if (localName.equals("Table")) {
            mCurrentIndex++;
            mIdList.add("");
            mLastNameList.add("");
            mFirstNameList.add("");
            mHeightList.add("");
            mHomeTownList.add("");
            mTeamNameList.add("");
            mAgeList.add("");
            mFullNameList.add("");
        } else if (localName.equals("ID")) {
            isIDTag = true;
        } else if (localName.equals("LastName")) {
            isLastNameTag = true;
        } else if (localName.equals("FirstName")) {
            isFirstNameTag = true;
        } else if (localName.equals("Height")) {
            isHeightTag = true;
        } else if (localName.equals("HomeTown")) {
            isHomeTownTag = true;
        } else if (localName.equals("TeamName")) {
            isTeamNameTag = true;
        } else if (localName.equals("Age")) {
            isAgeTag = true;
        } else if (localName.equals("FullName")) {
            isFullNameTag = true;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if (isIDTag) {
            // the ID
            mIdList.set(mCurrentIndex, new String(ch, start, length));
        } else if (isLastNameTag) {
            if (!mIsSegment) {
                mLastNameList.set(mCurrentIndex, new String(ch, start,
                        length));
            } else {
                mLastNameList.set(mCurrentIndex,
                        mLastNameList.get(mLastNameList.size() - 1)
                                + new String(ch, start, length));
            }
            mIsSegment = true;
        } else if (isFirstNameTag) {
            if (!mIsSegment) {
                mFirstNameList.set(mCurrentIndex, new String(ch, start,
                        length));
            } else {
                mFirstNameList.set(mCurrentIndex,
                        mFirstNameList.get(mFirstNameList.size() - 1)
                                + new String(ch, start, length));
            }
            mIsSegment = true;
        } else if (isHeightTag) {
            if (!mIsSegment) {
                mHeightList.set(mCurrentIndex,
                        new String(ch, start, length));
            } else {
                mHeightList.set(mCurrentIndex,
                        mHeightList.get(mHeightList.size() - 1)
                                + new String(ch, start, length));
            }
            mIsSegment = true;
        } else if (isHomeTownTag) {
            if (!mIsSegment) {
                mHomeTownList.set(mCurrentIndex, new String(ch, start,
                        length));
            } else {
                mHomeTownList.set(mCurrentIndex,
                        mHomeTownList.get(mHomeTownList.size() - 1)
                                + new String(ch, start, length));
            }
            mIsSegment = true;
        } else if (isTeamNameTag) {
            if (!mIsSegment) {
                mTeamNameList.set(mCurrentIndex, new String(ch, start,
                        length));
            } else {
                mTeamNameList.set(mCurrentIndex,
                        mTeamNameList.get(mTeamNameList.size() - 1)
                                + new String(ch, start, length));
            }
            mIsSegment = true;
        } else if (isAgeTag) {
            if (!mIsSegment) {
                mAgeList.set(mCurrentIndex, new String(ch, start, length));
            } else {
                mAgeList.set(mCurrentIndex,
                        mAgeList.get(mAgeList.size() - 1)
                                + new String(ch, start, length));
            }
            mIsSegment = true;
        } else if (isFullNameTag) {
            if (!mIsSegment) {
                mFullNameList.set(mCurrentIndex, new String(ch, start,
                        length));
            } else {
                mFullNameList.set(mCurrentIndex,
                        mFullNameList.get(mFullNameList.size() - 1)
                                + new String(ch, start, length));
            }
            mIsSegment = true;
        }
    }

    @Override
    public void endElement(String uri, String localName, String name)
            throws SAXException {
        if (localName.equals("ID")) {
            isIDTag = false;
        } else if (localName.equals("LastName")) {
            isLastNameTag = false;
            mIsSegment = false;
        } else if (localName.equals("FirstName")) {
            isFirstNameTag = false;
            mIsSegment = false;
        } else if (localName.equals("Height")) {
            isHeightTag = false;
            mIsSegment = false;
        } else if (localName.equals("HomeTown")) {
            isHomeTownTag = false;
            mIsSegment = false;
        } else if (localName.equals("TeamName")) {
            isTeamNameTag = false;
            mIsSegment = false;
        } else if (localName.equals("Age")) {
            isAgeTag = false;
            mIsSegment = false;
        } else if (localName.equals("FullName")) {
            isFullNameTag = false;
            mIsSegment = false;
        }
    }

}

今すぐ動作するはずです。

于 2012-11-29T11:56:57.007 に答える