2017-02-17 7 views
0

Ich versuche, die Namen der Passagiere in einer ArrayList in eine XML-Datei zu schreiben. Ich muss den Code für die Erstellung des XML-Dokuments in meine Aircraft-Klasse einfügen. Unten ist mein Code für die Klasse Aircraft. Dazu gehört auch mein Code für die Hauptaufrufmethode App.java. In keiner dieser Klassen gibt es Fehler. Ein Teil von mir denkt jedoch, dass die XML-Datei nicht korrekt erstellt wird. Ich habe mich gefragt, ob ich die writeNames() -Methode irgendwo in der App.java aufrufen muss, damit sie richtig funktioniert?Name von ArrayList in XML-Datei schreiben

Flugzeugklasse:

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

Warum nicht JAXB verwenden, die von Objekt zu XML fließender Übersetzung erlauben würde, und wieder zurück? –

+0

@HovercraftFullOfEels Ich habe noch nicht gelernt, wie man das macht – javacrazy

+0

Verrückt, betrachten Sie es nachschlagen. Es ist ziemlich flexibel, kraftvoll und einfach nur schlau. –

Antwort

0

Ja, basierend Sie den Code, den Sie zur Verfügung gestellt, wenn Sie die schreiben wollen Passagiere zu einer XML-Datei, müssen Sie die writePassengers-Methode des Flugzeugs aufrufen und die Liste von pa übergeben Sie möchten gerne schreiben.

Dies scheint nicht sinnvoll zu sein, da Sie die Liste der Passagiere lokal festlegen, wenn Sie die Klasse erstellen und diese als Parameter in der Methode benötigen. Sie sollten den Parameter entfernen können, und haben immer noch einwandfreie Funktionalität:

public ArrayList<String> writeNames() 

dann können Sie die Funktion in der App-Klasse aufrufen, wie unten, nachdem das Flugzeug Klasse erstellt wurde:

aircraft.writeNames() 
+0

Ich sehe was du sagst, ich habe es versucht. Wenn ich dies tue, verursacht es dann einen Fehler in diesen Zeilen: Name.appendChild (document.createTextNode (passagiers.get (0))); – javacrazy

+0

Ich habe diese Bibliotheken nicht verwendet, um ein XML-Dokument zu erstellen, aber ich gehe davon aus, dass der Fehler durch die Weitergabe von passagier.get (0) verursacht wird, das ein Objekt vom Typ Passagier zurückgibt. Ich würde versuchen, einen String zurückzugeben. Ich denke, dass Ihr passagier.get (0) .getInfo() dies erreichen könnte. Außerdem hatte ich nicht zu viel auf Ihre Schreibmethode geschaut, aber ich sehe jetzt, dass Sie alles fest programmiert haben. Wie Sie sehen können, haben Sie für jeden Passagier in dieser Methode die gleichen Codezeilen geschrieben. Stattdessen sollten Sie eine Sammlung durchlaufen, um die Anzahl der Codezeilen zu reduzieren, die Sie schreiben müssen. – HedonicHedgehog

+0

Okay, vielen Dank für die Hilfe. Ich bin momentan von meinem Computer entfernt, aber ich werde Ihre Vorschläge versuchen und zurückkommen, wenn ich irgendwelche Probleme habe. – javacrazy

1

Wieder Wenn dies mein Problem wäre, würde ich JAXB verwenden, um meine Java-Klassen zu XML und zurück zu marshallen, da dies alle zappeligen Teile des manuellen Erstellens des XML-Dokuments aus Ihren Händen und in die Bibliotheken erfordert.

Arraylisten nutzen zu können, sie mit der @XmlElementWrapper Annotation annotieren würde.

Zum Beispiel, wenn Sie ein maxStudents Feld eines maxStudent Feld, einen Klassenraum der Klasse mit einem Lehrer Feld hatten, können Sie Ihre Klassen mit JAXB Annotationen erstellen könnten, etwa so:

@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() + "]"; 
    } 

} 

Und dann sie einfach über wenige Bit-Code in XML Marshal:

// 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(); 
} 

Welche zurück:

<?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> 
Verwandte Themen