2017-02-17 38 views
0

我想写一个ArrayList中的乘客名称到一个XML文件。我必须将用于创建XML文档的代码放入我的飞机类中。以下是我的飞机班的代码。这还包括我的主要调用方法App.java的代码。这两类中都没有错误;然而,我的一部分人认为它没有正确创建XML文件。我想知道是否必须调用App.java中任何位置的writeNames()方法才能正常工作?从ArrayList写入名称到XML文件

飞机类:

import java.util.ArrayList; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 

public class Aircraft { 

    private double maxSpeed; 
    private int maxPassengers; 
    private int numEngines; 

    private Pilot pilot; 
    private Stewardess stewardess; 
    private ArrayList<Passenger> passengers; 

    Aircraft(double maxSpeed, int maxPassengers, int numEngines, Pilot pilot, 
     Stewardess stewardess, ArrayList<Passenger> passengers) 
{ 
    this.pilot = pilot; 
    this.stewardess = stewardess; 
    this.passengers = passengers; 
    this.maxSpeed = maxSpeed; 
    this.maxPassengers = maxPassengers; 
    this.numEngines = numEngines; 
} 

public String getInfo() 
{ 
    return "Aircraft" + "\n" + "Max Speed: " + this.maxSpeed + " mph " + "\n" + 
      "Max Passengers: " + this.maxPassengers + " passengers " + "\n" + "Number of Engines: " + 
      this.numEngines + " engines" + "\n" + "\n" + this.pilot.getInfo() + "\n" + "\n" + "Stewardess" 
      + this.stewardess.getInfo() + "\n" + "\n" + "Passenger 1" + passengers.get(0).getInfo() + "\n"+ "\n" + "Passenger 2" 
      + passengers.get(1).getInfo() + "\n" + "\n" + "Passenger 3" + passengers.get(2).getInfo() + "\n" + "\n" + "Passenger 4" 
      + passengers.get(3).getInfo(); 
} 

public ArrayList<String> writeNames(ArrayList<String> passengers) 
{ 
    try { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder;    

     builder = factory.newDocumentBuilder(); 
     Document document = builder.newDocument(); 
     Element xmlRoot = document.createElement("Passengers"); 
     document.appendChild(xmlRoot); 

     Element passenger; 
     Element name; 

     //passenger1 
     passenger = document.createElement("Passenger"); 
     passenger.setAttribute("id", "1"); 

     name = document.createElement("Name"); 
     name.appendChild(document.createTextNode(passengers.get(0))); 
     passenger.appendChild(name); 

     xmlRoot.appendChild(passenger); 

     //passenger2 
     passenger = document.createElement("Passenger"); 
     passenger.setAttribute("id", "2"); 

     name = document.createElement("Name"); 
     name.appendChild(document.createTextNode(passengers.get(1))); 
     passenger.appendChild(name); 

     xmlRoot.appendChild(passenger); 

     //passenger3 
     passenger = document.createElement("Passenger"); 
     passenger.setAttribute("id", "3"); 

     name = document.createElement("Name"); 
     name.appendChild(document.createTextNode(passengers.get(2))); 
     passenger.appendChild(name); 

     xmlRoot.appendChild(passenger); 

     //passenger4 
     passenger = document.createElement("Passenger"); 
     passenger.setAttribute("id", "4"); 

     name = document.createElement("Name"); 
     name.appendChild(document.createTextNode(passengers.get(3))); 
     passenger.appendChild(name); 

     xmlRoot.appendChild(passenger);    

     //Write document to file 
     TransformerFactory transFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transFactory.newTransformer(); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     DOMSource source = new DOMSource(document); 
     StreamResult result = new StreamResult("src/passengers.xml"); 
     transformer.transform(source, result);    

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return passengers; 
} 

}

App.java:

import java.util.ArrayList; 

public class App { 

public static void main(String[] args) { 

    //Four roommates that share same address, have different suitcases, traveling to different destinations 
    Address address = new Address("University Park", "PA", "16802");   
    Suitcase suitcase1 = new Suitcase(7, 75, "Carry Strap"); 
    Suitcase suitcase2 = new Suitcase(5, 70, "No Carry Strap"); 
    Suitcase suitcase3 = new Suitcase(4, 60, "No Carry Strap"); 
    Suitcase suitcase4 = new Suitcase(8, 55, "Carry Strap"); 

    //Stewardess Info 
    Suitcase suitcaseStewardess = new Suitcase(4, 40, "No Carry Strap"); 
    Address addressStewardess = new Address("Doylestown", "PA", "18902"); 
    Stewardess stewardess = new Stewardess(4, "Full Time", 40, suitcaseStewardess, addressStewardess); 

    //Pilot Info 
    Suitcase suitcasePilot = new Suitcase(10, 50, "Carry Strap"); 
    Address addressPilot = new Address("Raliegh", "NC", "27513"); 
    Map map = new Map(14000.5, "United States", "Northeast"); 
    Pilot pilot = new Pilot(7, 40, "Perfect", suitcasePilot, map, addressPilot); 

    //Passenger Info 
    ArrayList<Passenger> passengers = new ArrayList<>(); 
    passengers.add(new Passenger("Luke Harding", 1400, "England", "First Class - A14", suitcase1, address)); 
    passengers.add(new Passenger("Dalton Sydnor", 1000, "Mexico", "First Class - G7", suitcase2, address)); 
    passengers.add(new Passenger("Ian Smithgall", 700, "Russia", "First Class - C4", suitcase3, address)); 
    passengers.add(new Passenger("Matt Yohe", 850, "Indiana", "First Class - B1", suitcase4, address)); 

    //Aircraft Info 
    Aircraft aircraft = new Aircraft (750, 400, 4, pilot, stewardess, passengers); 

    System.out.println(aircraft.getInfo()); 
} 

}

+0

为什么不使用JAXB这样可以让更多的通顺从对象到XML又回来了? –

+0

@HovercraftFullOfEels我还没有学会如何去做,但 – javacrazy

+0

疯了,考虑查找它。它非常灵活,功能强大,简单漂亮。 –

回答

0

是基于关闭您提供的代码,如果你想要写的乘客输入XML文件,您需要调用飞机的writePassengers方法并通过pa列表你想写的乘客。

这似乎没有道理,因为您在创建类时在本地设置乘客列表,并且仍要求它作为方法中的参数。您应该能够删除参数,仍然有正确的功能:

public ArrayList<String> writeNames() 

,那么你可以调用函数在App类如飞机类已创建以下后:

aircraft.writeNames() 
+0

我看到你在说什么,我试着这样做。但是,当我这样做时,它会在这些行中导致错误:name.appendChild(document.createTextNode(passengers.get(0))); – javacrazy

+0

我还没有使用这些库来创建一个XML文档,但我假设错误是由你传递的passenger.get(0)引起的,它返回一个Passenger类型的对象。我会尝试返回一个字符串。我认为你的passenger.get(0).getInfo()可能会做到这一点。 此外,我没有看太多你的写方法,但我现在看到你已经硬编码的一切。正如你所看到的,你用这种方法为每个乘客编写了相同的代码行。相反,您应该遍历一个集合以减少需要编写的代码行数。 – HedonicHedgehog

+0

好的,非常感谢你的帮助。我目前离开我的电脑,但如果我有任何问题,我会尝试您的建议并回来。 – javacrazy

1

同样,如果这是我的问题,那么我会使用JAXB将我的Java类编组为XML并返回,因为这需要手动创建XML文档的所有烦人部分,无需手动并进入库。

要使用的ArrayList你注释它们与@XmlElementWrapper注解。

举例来说,如果你有一个教室类与老师领域maxStudent场,一个maxStudents场,你可以用JAXB注释创建类,像这样:

@XmlRootElement(name = "person") 
@XmlAccessorType(XmlAccessType.FIELD) 
class Person { // base class 
    @XmlElement(name = "first_name") 
    private String firstName; 
    @XmlElement(name = "last_name") 
    private String lastName; 

    public Person(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public Person() { 
     // Default constructors are required 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @Override 
    public String toString() { 
     return "Person [firstName=" + firstName + ", lastName=" + lastName + "]"; 
    } 

} 

@XmlRootElement(name = "teacher") 
@XmlAccessorType(XmlAccessType.FIELD) 
class Teacher extends Person { 
    @XmlElement(name = "grade_level") 
    private String gradeLevel; 

    public Teacher(String firstName, String lastName, String gradeLevel) { 
     super(firstName, lastName); 
     this.gradeLevel = gradeLevel; 
    } 

    public Teacher() { 
     // Default constructors are required 
    } 

    public String getGradeLevel() { 
     return gradeLevel; 
    } 

    public void setGradeLevel(String gradeLevel) { 
     this.gradeLevel = gradeLevel; 
    } 

    @Override 
    public String toString() { 
     return "Teacher [gradeLevel=" + gradeLevel + ", getFirstName()=" + getFirstName() + ", getLastName()=" 
       + getLastName() + "]"; 
    } 

} 

@XmlRootElement(name = "student") 
@XmlAccessorType(XmlAccessType.FIELD) 
class Student extends Person { 
    @XmlElement(name = "age") 
    private int age; 

    public Student(String firstName, String lastName, int age) { 
     super(firstName, lastName); 
     this.age = age; 
    } 

    public Student() { 

    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

    @Override 
    public String toString() { 
     return "Student [age=" + age + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; 
    } 

} 

@XmlRootElement(name = "class_room") 
@XmlType(propOrder = {"teacher", "maxStudents", "students"}) 
@XmlAccessorType(XmlAccessType.FIELD) 
class ClassRoom { 
    @XmlElementRef 
    private Teacher teacher; 
    @XmlElementWrapper(name = "students") 
    @XmlElement(name = "student") 
    private List<Student> students = new ArrayList<>(); 
    @XmlElement(name = "max_students") 
    int maxStudents; 

    public ClassRoom(Teacher teacher, int maxStudents) { 
     this.teacher = teacher; 
     this.maxStudents = maxStudents; 
    } 

    public ClassRoom() { 

    } 

    public void addStudent(Student student) { 
     students.add(student); 
    } 

    public List<Student> getStudents() { 
     return students; 
    } 

    public Teacher getTeacher() { 
     return teacher; 
    } 

    public int getMaxStudents() { 
     return maxStudents; 
    } 

    @Override 
    public String toString() { 
     return "ClassRoom [teacher=" + teacher + ", students=" + students + ", maxStudents=" + maxStudents + "]"; 
    } 

} 

,然后将它们编组为XML只需通过代码几位:

// create and fill my class room 
ClassRoom classRoom = new ClassRoom(new Teacher("John", "Smith", "Four"), 30); 
classRoom.addStudent(new Student("Bill", "Jones", 11)); 
classRoom.addStudent(new Student("Cathy", "Franks", 12)); 
classRoom.addStudent(new Student("Henry", "Rotter", 11)); 
classRoom.addStudent(new Student("Barry", "Edwards", 11)); 
classRoom.addStudent(new Student("Daffy", "Duck", 10)); 
classRoom.addStudent(new Student("Mickey", "Mouse", 11)); 
classRoom.addStudent(new Student("Donald", "Trump", 11)); 

try { 
    // marshall to XML 
    JAXBContext context = JAXBContext.newInstance(ClassRoom.class); 
    Marshaller marshaller = context.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.marshal(classRoom, System.out); 
} catch (JAXBException e) { 
    e.printStackTrace(); 
} 

将返回:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<class_room> 
    <teacher> 
     <first_name>John</first_name> 
     <last_name>Smith</last_name> 
     <grade_level>Four</grade_level> 
    </teacher> 
    <max_students>30</max_students> 
    <students> 
     <student> 
      <first_name>Bill</first_name> 
      <last_name>Jones</last_name> 
      <age>11</age> 
     </student> 
     <student> 
      <first_name>Cathy</first_name> 
      <last_name>Franks</last_name> 
      <age>12</age> 
     </student> 
     <student> 
      <first_name>Henry</first_name> 
      <last_name>Rotter</last_name> 
      <age>11</age> 
     </student> 
     <student> 
      <first_name>Barry</first_name> 
      <last_name>Edwards</last_name> 
      <age>11</age> 
     </student> 
     <student> 
      <first_name>Daffy</first_name> 
      <last_name>Duck</last_name> 
      <age>10</age> 
     </student> 
     <student> 
      <first_name>Mickey</first_name> 
      <last_name>Mouse</last_name> 
      <age>11</age> 
     </student> 
     <student> 
      <first_name>Donald</first_name> 
      <last_name>Trump</last_name> 
      <age>11</age> 
     </student> 
    </students> 
</class_room>