0

私はこれに対する答えを探し回っていますが、どこにでもある SAX リソースはどれも、私が望んでいるよりも少し少ないものです。本をページングするのではなく、アプリケーションを介してゲストが非常に長いリストにアクセスできるレストラン用の Android アプリケーションを作成しています。私のxmlは次のようになります。

<bar>
    <liquor>
        <type>American Rye</type>
        <distillery>Sazerac<distillery>
        <bottling>18 Year</bottling>
        <place>Frankfort, KY</place>
        <proof>90</proof>
        <price>20<price>
    </liquor>

    <beer>
        <type>American Microbrew</type>
        <brewery>New Belgium</brewery>
        <bottling>La Folie Sour Brown 750ml</bottling>
        <place>Fort Collins, CO</place>
        <price>20</price>
    </beer>
</bar>

私が数百の酒しか持っていなかったとき、それはうまくいきました. ただし、「type」と「price」などの特定の要素名を 2 回使用しているため、混乱しています。これが私のパーサーです:

public class BeerParser extends DefaultHandler {

private ArrayList<Beer> BeerL;
private boolean pastTheLiquor = false;

public ArrayList<Beer> getItems(String ArrayType){
    ArrayList<Beer> tmpItem = new ArrayList<Beer>();
    for (Beer beer : BeerL){
        if (beer.getType().equals(ArrayType)){
        tmpItem.add(beer);
            }
        }
    return tmpItem;
}


InputStream barXmlInputStream;

String tmpValue;


Beer beerTmp;



public BeerParser(InputStream barXmlInputStream) {



    this.barXmlInputStream = barXmlInputStream;

    BeerL = new ArrayList<Beer>();

    parseDocument();

    printDatas();

}

private void parseDocument() {



    SAXParserFactory factory = SAXParserFactory.newInstance();

    try {

        SAXParser parser = factory.newSAXParser();

        parser.parse(barXmlInputStream, this);



    } catch (ParserConfigurationException e) {

        System.out.println("ParserConfig error");

    } catch (SAXException e) {

        System.out.println("SAXException : xml not well formed");

    } catch (IOException e) {

        System.out.println("IO error");

    }

}

private void printDatas() {


    for (Beer tmpB : BeerL) {

        System.out.println(tmpB.toString());

    }


}

@Override

public void startElement(String s, String s1, String elementName, Attributes attributes) throws SAXException {


    if (elementName.equalsIgnoreCase("beer")) {

        pastTheLiquor = true;
        beerTmp = new Beer();



    }

}

@Override

public void endElement(String s, String s1, String element) throws SAXException {


    if (element.equals("beer")) {

            BeerL.add(beerTmp);

        }
    if (pastTheLiquor){
        if (element.equalsIgnoreCase("type")) {

            beerTmp.setType(tmpValue);

        }
        if (element.equalsIgnoreCase("brewery")) {

            beerTmp.setBrewery(tmpValue);

        }
        if (element.equalsIgnoreCase("bottling")) {

            beerTmp.setBottling(tmpValue);
            beerTmp.hasBottling = true;

        }

        if (element.equalsIgnoreCase("price")) {

            beerTmp.setPrice(tmpValue);

        }

        if (element.equalsIgnoreCase("place")) {

            beerTmp.setPlace(tmpValue);

        }
    }

}



@Override

public void characters(char[] ac, int i, int j) throws SAXException {

    tmpValue = new String(ac, i, j);

}

}

つまり、酒はビールの前に来ていたので、パーサーは「ビール」を見る前に「タイプ」を見ていたため、インスタンス化されなかったビールオブジェクトbeerTmpの「setType()」関数を呼び出そうとしていました。パーサーが「ビール」の最初のインスタンスを見るまで待機するブール値を使用しようとしましたが、空のリストを取得しています。これは、酒類の配列を作成するほぼ同一のパーサーが機能しているため、本当にイライラしています。見事に。

ファイル内の酒をスキップする簡単な方法はありますか? 私はブール値で正しい軌道に乗っていますか? SAX パーサーを窓の外に放り出し、別のものを使用する必要がありますか? ありがとうございました。

4

2 に答える 2

0

sax パーサーは、すべての要素のコールバックを呼び出します。それらの一部を考慮したくない場合は、簡単に "return;" を実行してください。解析前にそれらを除外する方法はありません。

ファイル内の酒をスキップする簡単な方法はありますか? 私はブール値で正しい軌道に乗っていますか?

Stack構造を使用して、後で検討する必要があるデータを格納 (プッシュ) できます (ポップ)。

SAX は他の XML API より使いこなすのが難しいのは明らかです。場合によっては、SAX が唯一の選択肢になります。だから、あきらめないでください。いつの間にか必要になります。

于 2013-01-09T19:11:42.377 に答える
0

以下の簡略化されたバージョンの作品。ご了承ください

1) xml にバグがあります。 <type>American Rye</liquor>

2) xml では大文字と小文字が区別されるため、equalsIgnoreCase は無関係です。

3) この仕事にはJAXBが最適

public class BeerParser extends DefaultHandler {
    private List<Beer> list = new ArrayList<>();
    private Beer beer;
    private String element;

    public static void main(String[] args) throws Exception {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        BeerParser bp = new BeerParser();
        parser.parse(new File("1.xml"), bp);
        System.out.println(bp.list);
    }

    @Override
    public void startElement(String s, String s1, String element, Attributes attributes) {
        if (element.equals("beer")) {
            beer = new Beer();
        }
        this.element = element;
    }

    @Override
    public void endElement(String s, String s1, String element) {
        if (element.equals("beer")) {
            list.add(beer);
            beer = null;
        }
    }

    @Override
    public void characters(char[] ac, int i, int j) {
        if (beer != null) {
            String value = new String(ac, i, j);
            if (element.equals("type")) {
                beer.setType(value);
            } else if (element.equals("brewery")) {
                beer.setBrewery(value);
            } else if (element.equals("bottling")) {
                beer.setBottling(value);
            } else if (element.equals("price")) {
                beer.setPrice(value);
            } else if (element.equals("place")) {
                beer.setPlace(value);
            }
        }
    }
}
于 2013-01-09T19:32:51.667 に答える