我正在使用 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>
我遇到的问题是我需要从AddressLine
和pickup
获取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解析器的东西,但我可以找到一个匹配我想要的例子。
答案 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。如果这有帮助,请告诉我。