0

SAX解析で空のxml文字列を検索または分離する方法。

    <Table diffgr:id="Table142" msdata:rowOrder="141">
    <TeamIDGiven>7</TeamIDGiven>
    <City>Wolfpack</City>
    <TeamName>North Carolina State</TeamName>
    </Table>

    <Table diffgr:id="Table143" msdata:rowOrder="142">
    <TeamIDGiven>308</TeamIDGiven>
    **<City/>**
    <TeamName>North Dakota</TeamName>

    </Table> 

   <Table diffgr:id="Table144" msdata:rowOrder="143">
   <TeamIDGiven>309</TeamIDGiven>
   <City>Bison</City>
   <TeamName>North Dakota State</TeamName>
  </Table>

上記のXmlデータを見てください。表2では、Cityは空のタグです。このため、この行の次の行の都市名を取得しています。たとえば、3番目のテーブルデータを2番目のテーブルに取得しています。つまり、空のデータの代わりに「Bison」が表示されています。私の質問は、sax解析で空のタグデータを分離または検索する方法です。私のコードはここにあります。

4

2 に答える 2

4

こんにちは、これを試してみてください。正常に動作しています。

RAWフォルダに入れたXMLファイルと名前「abc.xml」

<?xml version="1.0" encoding="utf-8"?>
<Tables><Table id="Table142" rowOrder="141">
    <TeamIDGiven>7</TeamIDGiven>
    <City>Wolfpack</City>
    <TeamName>North Carolina State</TeamName>
    </Table>

    <Table id="Table143" rowOrder="142">
    <TeamIDGiven>308</TeamIDGiven>
    <City/>
    <TeamName>North Dakota</TeamName>

    </Table> 

   <Table id="Table144" rowOrder="143">
   <TeamIDGiven>309</TeamIDGiven>
   <City>Bison</City>
   <TeamName>North Dakota State</TeamName>
  </Table></Tables>

以下のようにパブリッククラスBeanを作成します

public class Table_Beans {
    private String TeamIDGiven;
    private String City;
    private String TeamName;

    public String getTeamIDGiven() {
        return TeamIDGiven;
    }

    public void setTeamIDGiven(String teamIDGiven) {
        TeamIDGiven = teamIDGiven;
    }

    public String getCity() {
        return City;
    }

    public void setCity(String city) {
        City = city;
    }

    public String getTeamName() {
        return TeamName;
    }

    public void setTeamName(String teamName) {
        TeamName = teamName;
    }

}

以下のXMLhandlerクラス。

public class TestXMLhandler extends DefaultHandler {

    private StringBuffer buffer = new StringBuffer();
    private ArrayList<Table_Beans> data_list;
    private Table_Beans data;

    public ArrayList<Table_Beans> getData() {
        return data_list;
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {

        buffer.setLength(0);
        if (localName.equals("Tables")) 
            data_list = new ArrayList<Table_Beans>();
        else if (localName.equals("Table")) 
            data = new Table_Beans();
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if (localName.equalsIgnoreCase("TeamIDGiven"))
            data.setTeamIDGiven(buffer.toString().trim());
        else if (localName.equalsIgnoreCase("City"))
            data.setCity(buffer.toString().trim());
        else if (localName.equalsIgnoreCase("TeamName"))
            data.setTeamName(buffer.toString().trim());
        else if (localName.equalsIgnoreCase("Table"))
            data_list.add(data);
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        buffer.append(ch, start, length);
    }

}

以下の主な活動。

public class Test1 extends Activity {

    private ArrayList<Table_Beans> data1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getData();
    }

    private void getData() {

        try {
            InputSource inSource = new InputSource(getResources()
                    .openRawResource(R.raw.abc));

            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();

            TestXMLhandler xmlhandler1 = new TestXMLhandler();
            xr.setContentHandler(xmlhandler1);
            xr.parse(inSource);

            data1 = xmlhandler1.getData();

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

}

ここでdata1を確認してください。Cityが空白であることがわかりました。すべて動作しています。

于 2012-11-28T11:09:23.957 に答える
1

空のxmlタグを考慮して、前の回答のコードを調整しました。

class MyHandler extends DefaultHandler {
    boolean is_sno = false;
    boolean is_sname = false;
    boolean mIsSegment = false;

    int mCurrentIndex = -1;

    @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("");
        } else if (localName.equals("TeamIDGiven")) {
            is_sno = true;
        } else if (localName.equals("City")) {
            is_sname = true;
        }

    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {           
        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;
        }

    }

    @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("TeamIDGiven")) {
            is_sno = false;
        } else if (localName.equals("City")) {
            is_sname = false;
            mIsSegment = false;
        }

    }

}

それが機能するかどうかを確認します。多くのリストを単純なデータホルダークラスの単一のリストにラップするようにしてください。

于 2012-11-28T14:44:07.547 に答える