XML解析问题(多个标记)

时间:2012-12-07 11:44:19

标签: android xml parsing

我正在使用 DOM解析器解析 XML ,但我似乎遇到了一个问题,我的XML数据结构如下:

    <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>

我遇到的问题是我需要从AddressLinepickup获取destination,但他们需要分开,我现有的代码,我是将它们单独拉出来,但我只是拉入两者的第一行(第1行)。我正在使用的XML解析器代码是:

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));
        }

我主要活动中的代码是:

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 });

                }

我哪里错了?

我知道有一种称为SAX解析器的东西,但我可以找到一个匹配我想要的例子。

1 个答案:

答案 0 :(得分:0)

试试这个:

    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());
            }       
        }
    }

我为Pickup和Destination创建了不同的NodeList,你可以在其中获得其余的内部标签,目前我只显示AddressLine。如果这有帮助,请告诉我。