2009-07-21 9 views
0

J'essaye d'analyser un simple fichier XML dans mon application j2me. Mais l'analyse syntaxique échoue:kxml2 Analyse XML simple

fichier XML

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

Parser Snippet

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

Comment l'analyse échoue-t-elle? Avez-vous une exception? – kgiannakakis

+0

Exception: type inattendu (position: texte: Test Company1 ... –

Répondre

1

Je suppose que je peux voir ce qui se passe mal ici. Après avoir apparié la balise <company> et obtenu la valeur de l'attribut CompanyId, vous entrez une boucle while. Mais observer ce qui se passera à ce moment:

  1. La première fois que vous exécutez la condition while, l'analyseur correspondra à la balise de début <CompanyName>, donc la condition if sera vrai et vous obtiendrez le texte à l'intérieur du marque.
  2. Je ne suis pas trop intime avec le fonctionnement interne de kXml mais sur la deuxième itération votre état d'analyseur doit être soit pointant vers le noeud texte (qui est à l'intérieur de la <CompanyName> tag) ou à la balise de fin (ie. </CompanyName>). D'une manière ou d'une autre, vous perdez la condition parce que vous n'êtes pas à une balise de début.
  3. À ce stade, vous avez besoin que l'étiquette suivante soit l'étiquette de fin de <company>, cependant, votre état n'a toujours pas changé et cela ne sera pas satisfait.

Ma meilleure estimation est que le pointeur interne pointe au niveau du noeud de texte à l'intérieur <CompanyName> et qui est la raison pour laquelle vous obtenez le message "unexpected type (position: Text: Test Company1...".