私は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));
}
タグを取得する方法と、コードのどこが間違っているのでしょうか?