2017-02-17 16 views
0

ArrayList内の乗客の名前をXMLファイルに書き込もうとしています。私はXML文書の作成のためのコードをAircraftクラスに入れなければなりません。以下は、航空機クラスの両方のコードです。これには、主な呼び出しメソッドApp.java用のコードも含まれています。これらのクラスのいずれにもエラーはありません。しかし、私の一部は、XMLファイルを正しく作成していないと考えています。私はwriteNames()メソッドをApp.javaのどこでも呼び出して、正しく動作させる必要があるのだろうかと思っていましたか?名前を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

そしてもう一度? –

+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型のオブジェクトを返すpassenger.get(0)を渡すことによってエラーが発生したと想定しています。私はストリングを返そうとします。私はあなたのpassenger.get(0).getInfo()がこれを達成するかもしれないと思います。 さらに、私はあなたの書き込みメソッドをあまり見すぎていませんでしたが、今はすべてをハードコードしていることがわかりました。ご覧のとおり、このメソッドでは、乗客ごとに同じ行のコードを記述しています。代わりに、コレクションを繰り返してコードの行数を減らす必要があります。 – HedonicHedgehog

+0

さて、どうもありがとうございました。私は現在自分のコンピュータから離れていますが、問題があれば私はあなたの提案を試み、戻ってきます。 – javacrazy

1

を、これが私の問題だったらJAXBを使ってJavaクラスをXMLにマーシャリングしてやり直すことにします。これは手作業でXMLドキュメントを手作りでライブラリに作成する必要があるので、

あなたは@XmlElementWrapper注釈でそれらに注釈を付けたいのArrayListを使用するには。

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

} 
:あなたはmaxStudentフィールド、maxStudentsフィールドは、あなたがそうのように、JAXBの注釈を使用してクラスを作成することができ、教師のフィールドを持つクラスの部屋のクラスを持っていた場合例えば

@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へのより多くの流暢な翻訳を可能と思われるJAXBを使用しないのはなぜ
<?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> 
関連する問題