2012-12-07 4 views
0

Je suis analyse XML utilisant un analyseur DOM mais il me semble avoir rencontré un problème, je XML des données structurées comme les suivantes:XML Parsing Problème (Tags multiples)

<Bookings> 
    <BookingNo>12345678</BookingNo> 
    <Pickup> 
    <AddressLine>Line 1</AddressLine> 
    <AddressLine>Line 2</AddressLine> 
    <AddressLine>Line 3</AddressLine> 
    <AddressLine>Line 4</AddressLine> 
    <AddressLine>Line 5</AddressLine> 
    <Postcode> 
     <PostcodeOut>pstOut</PostcodeOut> 
     <PostcodeIn>pstIn</PostcodeIn> 
    </Postcode> 
    <AddressCoords> 
     <Latitude>1.12345670</Latitude> 
     <Longitude>-1.1234567890</Longitude> 
    </AddressCoords> 
    </Pickup> 
    <Destination> 
    <AddressLine>Line 1</AddressLine> 
    <AddressLine>Line 2</AddressLine> 
    <AddressLine>Line 3</AddressLine> 
    <Postcode> 
     <PostcodeOut>pstOut</PostcodeOut> 
     <PostcodeIn>pstIn</PostcodeIn> 
    </Postcode> 
    <AddressCoords> 
     <Latitude>1.1234567890</Latitude> 
     <Longitude>-1.1234567890</Longitude> 
    </AddressCoords> 
    </Destination> 
    <PickupTime>DateTime</PickupTime> 
    <DestinationTime>DateTime</DestinationTime> 
    <VehicleType>Car</VehicleType> 
    <NumberOfPassengers>1</NumberOfPassengers> 
    <Passengers> 
    <PassengerName>Name</PassengerName> 
    <PassengerContactNo>123456</PassengerContactNo> 
    </Passengers> 
    <Mileage>2</Mileage> 
</Bookings> 

Le problème ce que je suis est que je dois obtenir le AddressLine à la fois pickup et destination mais ils doivent être séparés, avec le code actuel que j'ai, je suis en les tirant séparément, mais je tire seulement dans la première ligne (ligne 1) des deux. Le code de l'analyseur XML J'utilise est:

public class XMLParser { 

    // constructor 
    public XMLParser() { 

    } 

    /** 
    * Getting XML from URL making HTTP request 
    * @param url string 
    * */ 
    public String getXmlFromUrl(String url) { 
     String xml = null; 

     try { 
      // defaultHttpClient 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 



      xml = EntityUtils.toString(httpEntity); 
      InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8")); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        is, "iso-8859-1"), 8); 
      StringBuilder sbtwo = new StringBuilder(); 
      String myfeed = null; 
      while ((myfeed = reader.readLine()) != null) { 
       final String newjsontwo = myfeed.replaceAll(
         "throw 'allowIllegalResourceCall is false.';", ""); 
       sbtwo.append(newjsontwo); 
      } 
      is.close(); 


     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     // return XML 
     return xml; 
    } 

    /** 
    * Getting XML DOM element 
    * @param XML string 
    * */ 
    public Document getDomElement(String xml){ 
     Document doc = null; 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     try { 

      DocumentBuilder db = dbf.newDocumentBuilder(); 

      InputSource is = new InputSource(); 
       is.setCharacterStream(new StringReader(xml)); 
       doc = db.parse(is); 

      } catch (ParserConfigurationException e) { 
       Log.e("Error: ", e.getMessage()); 
       return null; 
      } catch (SAXException e) { 
       Log.e("Error: ", e.getMessage()); 
       return null; 
      } catch (IOException e) { 
       Log.e("Error: ", e.getMessage()); 
       return null; 
      } 

      return doc; 
    } 

    /** Getting node value 
     * @param elem element 
     */ 
    public final String getElementValue(Node elem) { 
     Node child; 
     if(elem != null){ 
      if (elem.hasChildNodes()){ 
       for(child = elem.getFirstChild(); child != null; child = child.getNextSibling()){ 
        if(child.getNodeType() == Node.TEXT_NODE ){ 

         return child.getNodeValue(); 
        } 
       } 
      } 
     } 
     return ""; 
    } 

    /** 
     * Getting node value 
     * @param Element node 
     * @param key string 
     * */ 
    public String getValue(Element item, String str) {  
      NodeList n = item.getElementsByTagName(str);   
      return this.getElementValue(n.item(0)); 
     } 

et le code dans mon activité principale est:

XMLParser parser = new XMLParser(); 
        Document doc = parser.getDomElement(xml); // getting DOM 
        references = new ArrayList<String>(); 
        NodeList nl = doc.getElementsByTagName("Bookings"); 
        NodeList nlpickup = doc.getElementsByTagName("Pickup"); 
        NodeList nldestination = doc 
          .getElementsByTagName("Destination"); 
        AddressData = new StringBuilder(); 

        // looping through all item nodes <item> 
        for (int i = 0; i < nl.getLength(); i++) { 
         HashMap<String, String> map = new HashMap<String, String>(); 

         Element e = (Element) nl.item(i); 
         resultCode = parser.getValue(e, "BookingNo"); 
         Pickup = parser.getValue(e, "Pickup"); 
         DateTime = parser.getValue(e, "PickupTime"); 

         Element etwo = (Element) nlpickup.item(i); 

         PAddressTwo = parser.getValue(etwo, "AddressLine"); 

         // System.out.println("/// "+ AddressData); 
         // System.out.println("/////"+parser.getValue(etwo, 
         // "AddressLine")); 

         PPostIn = parser.getValue(etwo, "PostcodeOut"); 
         PPostOut = parser.getValue(etwo, "PostcodeIn"); 

         Element ethree = (Element) nldestination.item(i); 
         DAddressOne = parser.getValue(ethree, "AddressLine"); 
         DPostIn = parser.getValue(ethree, "PostcodeOut"); 
         DPostOut = parser.getValue(ethree, "PostcodeIn"); 

         splitDate(); 

         map.put("BookNo", resultCode); 
         map.put("Datetime", TimeFinal + " on " + DateFinal); 
         map.put("PickupAddress", PAddressTwo + " " + PPostIn 
           + " " + PPostOut); 
         map.put("DestinationAddress", DAddressOne + " " 
           + DPostIn + " " + DPostOut); 

         references.add(resultCode); 

         mylist.add(map); 
        } 

        adapter = new SimpleAdapter(
          MyJourney.this, 
          mylist, 
          R.layout.myjourneys_item, 
          new String[] { "BookNo", "Datetime", 
            "PickupAddress", "DestinationAddress" }, 
          new int[] { R.id.journeysRefText, 
            R.id.journeysDateText, 
            R.id.journeysFromText, R.id.journeysToText }); 

       } 

Où vais-je tort? Je sais qu'il y a quelque chose qui s'appelle un analyseur syntaxique SAX mais je peux trouver un exemple correspondant à ce que je recherche.

Répondre

0

Essayez ceci:

Element element = document.getDocumentElement(); 

    // For Pickup 
    NodeList nodeListPickup = element.getElementsByTagName("Pickup"); 
    for (int i = 0; i < nodeListPickup.getLength(); i++) { 
     Node node = nodeListPickup.item(i); 
     NodeList pickUp = node.getChildNodes(); 

     for (int j = 0; j < pickUp.getLength(); j++) { 

      Node nodePickup = pickUp.item(j); 
      String name = nodePickup.getNodeName(); 

      if(name.equals("AddressLine")){ 
       System.out.println("Pickup > AddressLine > " +nodePickup.getFirstChild().getNodeValue()); 
      }  
     } 
    } 

    // For Destination 
    NodeList nodeListDestination = element.getElementsByTagName("Destination"); 
    for (int i = 0; i < nodeListDestination.getLength(); i++) { 
     Node node = nodeListDestination.item(i); 
     NodeList destination = node.getChildNodes();     
     for (int j = 0; j < destination.getLength(); j++) { 

      Node nodeDestination = destination.item(j);  
      String name = nodeDestination.getNodeName(); 

      if(name.equals("AddressLine")){     
       System.out.println("Destination > AddressLine > " +nodeDestination.getFirstChild().getNodeValue()); 
      }  
     } 
    } 

J'ai créé différents NodeList pour les ramassages et destination, vous pouvez vous reposer des balises internes à l'intérieur aussi bien, actuellement je suis montrant que pour AddressLine. Faites-moi savoir si cela aide.

+0

Cela aide beaucoup, juste besoin de comprendre comment le structurer correctement maintenant lol –