kxml2 парсинг простого XML

Я пытаюсь разобрать простой файл 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 ответ

Решение

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

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

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

Другие вопросы по тегам