2012-06-26 41 views
1

我有一些問題寫我的java對象使用JAXB的XML文件。JAXB建立不正確XML

我的方法是這樣的:

public void printToXml(PNLExport export, String outputPath, boolean syso)throws Exception 
{ 

    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(outputPath); 
     JAXBContext contxt = JAXBContext.newInstance(PNLExport.class); 
     Marshaller m = contxt.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
     m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); 
     if(syso){ 
      System.out.println(); 
      m.marshal(export, System.out); 
     } 
     m.marshal(export, fos);  

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (fos != null) { 
       fos.close(); 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
}//printToXml 

關閉根元素標籤之後,它顯示了一些奇怪的行爲:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <PNLExport version=""> 
     <Header> 
      <RecType>0</RecType> 
      <DateFormat>DD.MM.YY</DateFormat> 
      <TimeFormat>HH:MM</TimeFormat> 
      <TimeMode>L</TimeMode> 
      <GenDate>25.06.12</GenDate> 
      <GenTime>09:45</GenTime> 
     </Header> 
     <Records> 
      <Record> 
       <FlightRecord> 
        <RecType>21</RecType> 
        <Carrier>HG</Carrier> 
        <FlightNumber>8332</FlightNumber> 
        <FlightDate>30.06.12</FlightDate> 
        <Departure>VIE</Departure> 
        <Destination>OLB</Destination> 
        <DepTime>09:40</DepTime> 
        <DesTime>11:30</DesTime> 
       </FlightRecord> 
       <PaxRecord> 
        <RecType>32</RecType> 
        <BookingNumber>11632</BookingNumber> 
        <PaxNumber>1</PaxNumber> 
        <Name>SCHABAUER,Franz</Name> 
        <Salutation>MR</Salutation> 
        <BookingState>OK</BookingState> 
        <TicketType>T</TicketType> 
       </PaxRecord> 
       <PaxRecord> 
        <RecType>32</RecType> 
        <BookingNumber>11632</BookingNumber> 
        <PaxNumber>2</PaxNumber> 
        <Name>SCHABAUER,Vera</Name> 
        <Salutation>MRS</Salutation> 
        <BookingState>OK</BookingState> 
        <TicketType>T</TicketType> 
       </PaxRecord> 
      </Record> 
     </Records> 
    . 
    . 
    . 
    </PNLExport> 
    rrier> 
      <FlightNumber>8332</FlightNumber> 
      <FlightDate>02.07.12</FlightDate> 
      <Departure>VIE</Departure> 
      <Destination>OLB</Destination> 
      <DepTime>09:15</DepTime> 
      <DesTime>10:55</DesTime> 
     </FlightRecord> 
     <FlightRecord> 
      <RecType>21</RecType> 
      <Carrier>HG</Carrier> 
      <FlightNumber>8333</FlightNumber> 
      <FlightDate>02.07.12</FlightDate> 
      <Departure>OLB</Departure> 
      <Destination>VIE</Destination> 
      <DepTime>11:40</DepTime> 
      <DesTime>13:20</DesTime> 
     </FlightRecord> 
     <FlightRecord> 
      <RecType>21</RecType> 
      <Carrier>HG</Carrier> 
      <FlightNumber>8333</FlightNumber> 
      <FlightDate>29.06.12</FlightDate> 
      <Departure>OLB</Departure> 
      <Destination>VIE</Destination> 
      <DepTime>14:00</DepTime> 
      <DesTime>15:40</DesTime> 
     </FlightRecord> 
    </Record> 
</Records> 
    </PNLExport> 

怎麼回事錯在這裏?

這也是奇怪,有時XML是完全正確的...

回答

0

由於出現所需的內容之後的文件中額外的數據具有相同的結構,但不同的數據,你最有可能有兩個線程調用此方法和偶爾都寫入相同的文件。

0

創建FileOutputStream這樣簡單地打開了書面文件。它不會不是刪除以前的文件內容,而是用新的內容覆蓋它。如果舊的內容是比新內容,那麼舊的內容,後面部分將仍縈繞在文件中。這似乎正是這裏發生的事情。

解決這個最簡單的方法可能是將文件刪除寫它(僅當它存在,很明顯)前。