kxml2 парсинг простого XML - PullRequest
0 голосов
/ 21 июля 2009

Я пытаюсь проанализировать простой файл XML в моем приложении j2me. Но синтаксический анализ не удается:

Файл 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");

1 Ответ

1 голос
/ 29 июля 2009

Полагаю, я вижу, что здесь происходит не так. После того, как вы сопоставили тег <company> и получили значение атрибута CompanyId, вы вводите цикл while. Но обратите внимание, что произойдет в этот момент:

  1. При первом выполнении условия while парсер будет соответствовать стартовому тегу <CompanyName>, поэтому условие if будет истинным, и вы получите текст внутри тега.
  2. Я не слишком близок с внутренней работой kXml, но на второй итерации ваше состояние синтаксического анализатора должно указывать либо на текстовый узел (то есть внутри тега <CompanyName>), либо в конце тег (т. е. </CompanyName>). В любом случае, вы не сможете выполнить условие, потому что вы не находитесь в начальном теге.
  3. В этот момент вам требуется, чтобы следующий тег был конечным тегом <company>, однако ваше состояние все еще не изменилось, и это не будет выполнено.

На мой взгляд, внутренний указатель указывает на текстовый узел внутри <CompanyName>, и поэтому вы получаете сообщение "unexpected type (position: Text: Test Company1...".

...