0

Simple Java XML Parser(SJXP)を利用しようとしましたが、データクラスに解析する必要のあるXMLで問題が発生しました。

Data.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE SYSTEM "local-1.2.2.dtd" >
<data>
    <article>
        <field name="name" type="text">HOTELS</field>
        <field name="name_de" type="text">HOTELS</field>
        <field name="name_zh" type="text">酒店</field>
        <field name="color" type="text">6,68,109,0.85</field>
        <field name="textcolor" type="text">255,255,255,1</field>
    </article>
 <!-- 20000 more articles ... -->
</data>

私はそれをそのようにしようとしていました:

XmlHandler.java

private Map<String, Category> categoryMap;

private XMLParser<Category> categoryParser = new XMLParser<Category>(
        new DefaultRule<Category>(IRule.Type.CHARACTER, "/data/article") {
            @Override
            public void handleParsedCharacters(XMLParser<Category> parser, String text, Category category) {

                Log.d("XmlHandler", "Hello");
                if (category != null) {
                    categoryMap.put(category.getName(Category.LANG.EN), category);
                    Log.d("XmlHandler", "Saved category to map. New count="+categoryMap.values().size());
                    category.reset();
                } else {
                    category = new Category();
                    Log.d("XmlHandler", "Creating a new category");
                }
            }
        },
        new CategoryNameRule()
);


private class CategoryNameRule extends DefaultRule<Category> {

    private String nameKey = "";

    public CategoryNameRule() {
        super(Type.ATTRIBUTE, "/data/article/field", "name");
    }

    @Override
    public void handleParsedAttribute(XMLParser parser, int index,
                                      String value, Category category) {
        nameKey = value;
    }

    @Override
    public void handleParsedCharacters(XMLParser parser, String text, Category category) {

        Log.d("XmlHandler", "Handling nameKey="+nameKey);

        if(nameKey == null || nameKey.length() == 0){
            return;
        }else if( "name".equals(nameKey)){
           category.setName(Category.LANG.EN, text);
        }else if( "name_de".equals(nameKey)){
           category.setName(Category.LANG.DE, text);
        }else if( "name_zh".equals(nameKey)){
           category.setName(Category.LANG.ZH, text);
        }else if( "color".equals(nameKey)){
           category.colorBackground = getConvertedColor(text);
        }else if( "textcolor".equals(nameKey)){
           category.colorForeground = getConvertedColor(text);
        }

    }
}

問題は、ドキュメント全体が解析された後、ハッシュマップが空になり、その理由がわからないことです。私の推測では、IRule.Type.CHARACTERとIRule.Type.ATTRIBUTEの組み合わせを使用したいと思いますが、それを実現するかどうかはわかりません。

それに関するアイデア/経験はありますか?

4

1 に答える 1

0

ステファンさん、この質問を見逃してしまい申し訳ありません (別のことを検索しているときに、Google でたまたま見つけたのです)。

ここにはいくつかの混乱点があるので、明確にしてから、これを解決することをお勧めする方法を概説します (方法が見つからなかったと仮定しますが、これは 3 か月前のことだと思います)。

まず、正解です。CHARACTER ルールと ATTRIBUTE ルールの組み合わせが必要です。CHARACTER ルールは、タグ間のコンテンツを提供します。次に例を示します。

<tag>this is CHARACTER data</tag>

次に、ルールは必要なデータを含むタグをターゲットにする必要があります。上記の例では、/data/article/field レベルに到達するまで差別化データを取得できないように見えます (個々のフィールドには ATTRIBUTES と CHARACTERS の両方が含まれています)。あなたがしたい)

特定のユニークな記事のフィールド情報を収集していることがわかるように、新しい記事を入力したことを伝えるために (タグを開く) キーをオフにしているように見えますその場合、実際に TAG ルールを使用して、開始タグをヒットしたときにファイリングできるため、すぐに解析される新しい記事のために HashMap に新しいレコードを作成するなどのロジックを実行できます。

最後に、ハンドラに渡されるCategory引数は、パススルーユーザー変数です。

つまり、Parse メソッドを呼び出すことができます。

XMLParser<List<Article>> p = new XMLParser<List<Article>>(... stuff ...);
List<Article> articleList = new ArrayList<Article>();

p.parse(input, articleList);

これにより、すべてのハンドラーが articleList に直接アクセスできるようになるため、情報を直接解析/保存できるため、parse(...) の呼び出しが返されたときに、リストが最新で更新されていることがわかります。

userObject フィールドの parse メソッドに何も渡さない場合、ハンドラはすべてnull引数を受け取ります。

カテゴリの使用チェックは混乱し、ハンドラーが呼び出されたときにそこで変化する値を取得することを期待していると思いましたが、そうではありませんでした。それを明確にしたかっただけです。

概要

あなたの完璧なパーサー設計には、次の 3 つのルールが含まれると思います。

  • /data/article TAG ルール -- START 記事タグが検出された場合 (オプションで CLOSE 記事タグが検出された場合) に何かを実行します。
  • /data/article/field CHARACTER ルール -- フィールドの解析済み文字データを保存します。
  • /data/article/field ATTRIBUTE ルール -- フィールドの解析済み属性データを保存します。

それが役立つことを願っています!

于 2013-03-12T21:28:08.287 に答える