1

我正在使用 xml,但遇到了一个无法解决的问题。我在 xml 代码中有标记相同的标签,我需要将它们全部拉入,但我目前拥有的代码仅拉入第一个标签。我试图解析的 xml 代码是:

<Pickup>
  <AddressLine>Address Line 1</AddressLine>
  <AddressLine>Address Line 2</AddressLine>
  <AddressLine>Address Line 3</AddressLine>
  <AddressLine>Address Line 4</AddressLine>
  <AddressLine>Address Line 5</AddressLine>
     <Postcode>
        <PostcodeOut>PostCode One</PostcodeOut>
        <PostcodeIn>PostCode Two</PostcodeIn>
     </Postcode>
     <AddressCoords>
        <Latitude>00.000000</Latitude>
        <Longitude>-0.000000</Longitude>
    </AddressCoords>

我解析数据的代码是:

    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");
    NodeList nlAddress = doc.getElementsByTagName("AddressLine");

    AddressData = new StringBuilder();
    addressData = new ArrayList<String>();


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

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

        Element etwo = (Element) nlpickup.item(i);
        Element eaddress = (Element) nlAddress.item(i);
        PAddressTwo = parser.getValue(eaddress, "AddressLine");

         AddressData.append(PAddressTwo + " ,");

        PPostIn = parser.getValue(etwo, "PostcodeOut");
        PPostOut = parser.getValue(etwo, "PostcodeIn");
        VType = parser.getValue(e, "VehicleType");
        Dist =parser.getValue(e, "Mileage");

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

    }

我正在使用的 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));
    }

任何想法我如何获得标签以及代码中哪里出错了?

4

1 回答 1

0

你没有做错任何事。解析多个元素基本上就是您对 Bookings NodeList nl 所做的工作。通过使用标签名称、Document 类调用 getElementsByTagName 获取 NodeList,并使用 NodeList 的 getLength() 方法和 item() 方法遍历 NodeList 中的节点。

NodeList nl = doc.getElementsByTagName("AdressLine");
for(int i = 0; i < nl.getLength(); i++) {
   Node n = nl.item(0);
   // do something with node...
   Element e = (Element)n;
   e.getElementsByTagName("PostCode");
}

如果将 Node 对象强制转换为 Element 类,则 Element 类对象只允许访问相应 Node 对象的子元素。在上面的代码中,e.getElementsByTagName("PostCode");仅返回相应 AdressLine 元素的 PostCode 子元素。

在您使用以下代码行的情况下,例如,当您执行 Document 类的 getElementsByTagName 方法时,您正在解析整个 xml 文档的每个 AdressLine 。Document 类的 doc 对象对应于整个文档。

NodeList nlAddress = doc.getElementsByTagName("AddressLine");

我希望这有帮助!

于 2012-12-03T19:56:51.247 回答