我正在尝试将 XML 字符串从服务器传递到解析器并制作对象数组列表,但我目前得到的只是一个空数组列表。
获取和解析 XML 的代码
package parkinglot_api;
import java.net.*;
import java.sql.Date; 
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.io.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class ParkingLotInstance {
/*
 * Parking Lot API instance
 *      Constructor
 *          URL - String
 *      getParkingLotInfo()
 *          Returns XML from Specified Server
 *      parseParkingLotInfo()
 *          XML - String
 *          Returns ArrayList of Lot Objects
 */
public static URL serverURL;
public ParkingLotInstance( URL connurl ){
    serverURL = connurl;
}
public String getParkingLotInfo(){
    //Get a response from API server
    URL APIurl = this.serverURL;
    String APIresponse = "";
    System.out.println(APIurl);
    try {
        APIurl.openConnection();
        BufferedReader in = new BufferedReader(
                new InputStreamReader(APIurl.openStream()));
        String output;
        while ((output = in.readLine()) != null)
            APIresponse += output;
        in.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return APIresponse;
}
public ArrayList parseParkingLotInfo( String XML ){
        ArrayList lots = new ArrayList();
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            //Using factory get an instance of document builder
             dbf.setNamespaceAware(false);
             DocumentBuilder builder = dbf.newDocumentBuilder();
             InputSource inStream = new InputSource();
             inStream.setCharacterStream(new StringReader(XML));
             Document dom = builder.parse(inStream);
            //get the root element
            Element docEle = dom.getDocumentElement();
            //get a nodelist of elements
            NodeList nl = docEle.getElementsByTagName("Lot");
            if(nl != null && nl.getLength() > 0) {
                for(int i = 0 ; i < nl.getLength();i++) {
                    //get the employee element
                    Element el = (Element)nl.item(i);
                    //get the Employee object
                    Lot l = parseLot(el);
                    //add it to list
                    lots.add(l);
                }
            }
        }catch(ParserConfigurationException pce) {
            pce.printStackTrace();
        }catch(SAXException se) {
            se.printStackTrace();
        }catch(IOException ioe) {
            ioe.printStackTrace();
        }
        return lots;
}
public Lot parseLot(Element el){
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
    //Initialize Parking Lot Variables
    int id = getIntValue(el,"id");
    int occupancy = getIntValue(el,"occupancy");
    Boolean status = Boolean.parseBoolean(getTextValue(el,"status"));
    String name = getTextValue(el,"name");
    Date updated = null;
    try {
        updated = (Date) dateFormat.parse(getTextValue(el,"updated"));
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    String description = getTextValue(el,"description");
    //Construct Parking Lot
    Lot lot = new Lot( 
         id
       , occupancy 
       , status
       , name
       , updated
       , description 
      );
    return lot;
}
/**
 * I take a xml element and the tag name, look for the tag and get
 * the text content
 * i.e for <employee><name>John</name></employee> xml snippet if
 * the Element points to employee node and tagName is 'name' I will return John
 */
private String getTextValue(Element ele, String tagName) {
    String textVal = null;
    NodeList nl = ele.getElementsByTagName(tagName);
    if(nl != null && nl.getLength() > 0) {
        Element el = (Element)nl.item(0);
        textVal = el.getFirstChild().getNodeValue();
    }
    return textVal;
}
/**
 * Calls getTextValue and returns a int value
 */
private int getIntValue(Element ele, String tagName) {
    //in production application you would catch the exception
    return Integer.parseInt(getTextValue(ele,tagName));
}
}
对象类
 package parkinglot_api;
 import java.util.Date;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.thoughtworks.xstream.XStream;
 import com.thoughtworks.xstream.io.xml.DomDriver;
 public class Lot {
/*
 * Parking Lot Object
 *     ID: Unique Identifier
 *     Occupancy: The Current Amount of Cars in the Lot
 *     Status: Describes if the Lot is Open or Closed
 *     Name: A String Identifier of the Lot
 *     Updated: The Last time the Lot's current status record was updated.
 */
//Initiate Parking Lot Fields
public int id;
public int occupancy;
public Boolean status;
public String description;
public String name;
public Date updated;
//Parking Lot Constructor
public Lot( 
      int newId
    , int newOccupancy 
    , Boolean newStatus
    , String newName
    , Date newUpdated
    , String newDescription 
){
    id = newId;
    occupancy = newOccupancy;
    status = newStatus;
    name = newName;
    updated = newUpdated;
    description = newDescription;
}
//Convert Java Object to JSON
public String toJSON(){
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String jsonLot = gson.toJson(this);
    return jsonLot;
}
//Convert Java Object to XML
public String toXML(){
    XStream xstream = new XStream(new DomDriver());
    xstream.alias("lot", Lot.class);
    String xml = xstream.toXML(this);
    return xml;
}
}
从实例类调用方法的类
 package parkinglot_api;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 public class Example {
/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    URL serverURL;
    try {
        serverURL = new URL("http://localhost:8080");
        ParkingLotInstance API = new ParkingLotInstance(serverURL);
        String parkingLotXML = API.getParkingLotInfo();
        ArrayList Lots = API.parseParkingLotInfo(parkingLotXML);
        System.out.println(Lots);
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
 }
XML
<?xml version='1.0' ?>
    <campus count='4'>
    <lot>
      <id>1</id>
      <occupancy>25</occupancy>
      <status>true</status>
      <description></description>
      <name>lot1</name>
      <updated class="sql-date">2012-10-05</updated>
    </lot>
    <lot>
      <id>2</id>
      <occupancy>25</occupancy>
      <status>true</status>
      <description></description>
      <name>lot2</name>
      <updated class="sql-date">2012-10-06</updated>
    </lot>
    <lot>
      <id>3</id>
      <occupancy>25</occupancy>
      <status>false</status>
      <description></description>
      <name>lot3</name>
      <updated class="sql-date">2012-10-07</updated>
    </lot>
    <lot>
      <id>4</id>
      <occupancy>25</occupancy>
      <status>true</status>
      <description></description>
      <name>lot4</name>
      <updated class="sql-date">2012-11-07</updated>
    </lot>
    </campus>