0

j2me アプリケーションで単純な XML ファイルを解析しようとしています。しかし、解析は失敗します:

XML ファイル

<companies> 
       <company CompanyId="6"> 
           <CompanyName>Test Company 1</CompanyName> 
           <SapNumber>0</SapNumber> 
           <RootCompanyId>1</RootCompanyId> 
           <ParentCompanyId /> </company> 
    </companies>

パーサー スニペット

    KXmlParser parser = new KXmlParser();
    parser.setInput(new InputStreamReader(new ByteArrayInputStream(input.getBytes())));
    parser.nextTag();
    parser.require(XmlPullParser.START_TAG, null, "companies");

    while(parser.nextTag() == XmlPullParser.START_TAG) 
    {
        Company temp_company = new Company();
        parser.require(XmlPullParser.START_TAG, null, "company");
        String CompanyID = parser.getAttributeValue(0);
        temp_company.putValue("CompanyId", CompanyID);
        while(parser.nextTag() == XmlPullParser.START_TAG) 
        {
            if(parser.getName() == "CompanyName")
            {
                temp_company.putValue("CompanyName", parser.nextText());
            }
        }
        parser.require(XmlPullParser.END_TAG, null, "company");
        listCompany.put(CompanyID, temp_company);
    }
    parser.require(XmlPullParser.END_TAG, null, "elements");
4

1 に答える 1

1

ここで何が問題なのかがわかると思います。タグを照合し<company>て CompanyId 属性の値を取得したら、while ループに入ります。ただし、この時点で何が起こるかを観察してください。

  1. while 条件を初めて実行すると、パーサーは<CompanyName>開始タグと一致するため、if 条件が true になり、タグ内のテキストが取得されます。
  2. 私は kXml の内部の仕組みにあまり詳しくありませんが、2 回目の反復では、パーサーの状態はテキスト ノード (<CompanyName>タグ内) または終了タグ (つまり )を指している必要があります</CompanyName>。どちらにしても、開始タグにいないため、 while 条件は失敗します。
  3. この時点で、次のタグを の終了タグにする必要がありますが<company>、状態はまだ変更されておらず、これは満たされていません。

私の推測では、内部ポインターが内部のテキスト ノードを指している<CompanyName>ため、"unexpected type (position: Text: Test Company1..."メッセージが表示されるのです。

于 2009-07-29T11:58:23.813 に答える