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");コードでは、対応する AddressLine 要素の PostCode サブ要素のみが返されます。

次のコード行の場合、たとえば Document クラスの getElementsByTagName メソッドを実行すると、xml ドキュメント全体のすべての AdressLine が解析されます。Document クラスの doc オブジェクトは、ドキュメント全体に対応します。

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

これが役立つことを願っています!

于 2012-12-03T19:56:51.247 に答える