2009-07-21 8 views
0

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

XML File

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

Parser Отрывок

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"); 
+0

Как происходит синтаксический разбор? Вы получаете исключение? – kgiannakakis

+0

Исключение: неожиданный тип (позиция: Текст: Test Company1 ... –

ответ

1

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

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

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