2012-06-22 4 views
2

У меня есть следующий XML:Резка XML с JAXB

 


     <Package> 
     <PackageHeader> 
      <name>External Vendor File</name> 
      <description>External vendor file for some purpose</description> 
      <version>3.141694baR3</version> 
     </PackageHeader> 
     <PackageBody> 
      <Characteristic id="1"> 
       <Size> 
        <value>1.68</value> 
        <scale>Meters</scale> 
        <comment>Size can vary, depending on temperature</comment> 
       </Size> 
       <Weight> 
        <value>9</value> 
        <scale>M*Tons</scale> 
        <comment>His mama is so fat, we had to use another scale</comment> 
       </Weight> 
       <rating> 
        <ratingCompany>ISO</ratingCompany> 
        <rating:details xmlns:rating="http://www.w3schools.com/ratingDetails"> 
         <rating:value companyDepartment="Finance">A</rating:value> 
         <rating:expirationDate update="1/12/2010">1/1/2014</rating:expirationDate> 
         <rating:comment userID="z94234">You're not Silvia.</rating:comment> 
         <rating:comment userID="r24942">You're one of the Kung-Fu Creatures On The Rampage</rating:comment> 
         <rating:comment userID="i77880">TWO!</rating:comment> 
         <rating:priority>3</rating:priority> 
        </rating:details> 
       </rating> 
      </Characteristic> 
      <Characteristic id="2"> 
       <Size/>    
       <Weight/> 
       <rating/> 
      </Characteristic> 
      ... 
      <Characteristic id="n"/> 
     </PackageBody> 
    </Package> 

 

И следующий Java код:

 


    public class XMLTest { 

     public static void main(String[] args) throws Exception { 

      Package currentPackage = new Package();  
      Package sourcePackage = new Package(); 
      int totalCharacteristics; 

      PackageBody currentPackageBody = new PackageBody();  
      Characteristic currentCharacteristic = new Characteristic();   
      rating currentRating = new rating(); 

      FileInputStream fis = new FileInputStream("sourceFile.xml"); 

      JAXBContext myCurrentContext = JAXBContext.newInstance(Package.class); 
      Marshaller m = myCurrentContext.createMarshaller(); 
      Unmarshaller um = myCurrentContext.createUnmarshaller(); 

      sourcePackage = (Package)um.unmarshal(fis); 

      currentPackage.setPackageHeader(sourcePackage.getPackageHeader()); 

      totalCharacteristics = sourcePackage.getPackageBody().getCharacteristics().size(); 
      for (int i = 0; i < totalCharacteristics; i++) 
      { 
       currentRating = sourcePackage.getPackageBody().getCharacteristics().get(i).getrating(); 
      }  

      currentCharacteristic.setrating(currentRating); 
      currentPackageBody.getCharacteristics().add(currentCharacteristic); 

      currentPackage.setPackageBody(currentPackageBody);  
      m.marshal(currentPackage, new File("targetFile.xml")); 
      fis.close(); 
     } 
    } 

 

Который дает мне следующий XML:

 


    <Package> 
     <PackageHeader> 
      <name>External Vendor File</name> 
      <description>External vendor file for some purpose</description> 
      <version>3.141694baR3</version> 
     </PackageHeader> 
     <PackageBody> 
      <Characteristic id="1">   
       <rating> 
        <ratingCompany>ISO</ratingCompany> 
        <rating:details xmlns:rating="http://www.w3schools.com/ratingDetails"> 
         <rating:value companyDepartment="Finance">A</rating:value> 
         <rating:expirationDate update="1/12/2010">1/1/2014</rating:expirationDate> 
         <rating:comment userID="z94234">You're not Silvia.</rating:comment> 
         <rating:comment userID="r24942">You're one of the Kung-Fu Creatures On The Rampage</rating:comment> 
         <rating:comment userID="i77880">TWO!</rating:comment> 
         <rating:priority>3</rating:priority> 
        </rating:details> 
       </rating> 
      </Characteristic> 
      <Characteristic id="2">   
       <rating/>   
      </Characteristic> 
      ... 
      <Characteristic id="n"/> 
     </PackageBody> 
    </Package> 

 

И это это то, что мне нужно:

 


    <Package> 
     <PackageHeader> 
      <name>External Vendor File</name> 
      <description>External vendor file for some purpose</description> 
      <version>3.141694baR3</version> 
     </PackageHeader> 
     <PackageBody> 
      <Characteristic> 
       <rating id="1"> 
        <ratingCompany>ISO</ratingCompany> 
        <rating:details xmlns:rating="http://www.w3schools.com/ratingDetails">      
         <rating:comment userID="z94234">You're not Silvia.</rating:comment> 
         <rating:comment userID="r24942">You're one of the Kung-Fu Creatures On The Rampage</rating:comment> 
         <rating:comment userID="i77880">TWO!</rating:comment> 
         <rating:priority>3</rating:priority> 
        </rating:details> 
       </rating> 
      </Characteristic> 
      <Characteristic> 
       <rating id="2"/> 
      </Characteristic> 
      ... 
      <Characteristic/> 
     </PackageBody> 
    </Package> 

 

Но у меня есть несколько вопросов:

  • Как я мог реализовать способ чтения файла 4GBs? (например, чтение его с помощью StAX).

  • Если я хочу отфильтровать некоторые теги от источника до цели (как в последнем xml), должен ли я назначать их один за другим в targetFile? Есть ли итератор, который может позволить мне пройти через все подузлы и назначить их?

  • Если изменяется исходный файл, мне нужно перезапустить xjc и перекомпилировать весь проект?

Спасибо.

ответ

2

Для чтения огромных XML-файлов вам определенно нужен потоковый парсер, такой как StAX. Кроме того, вы можете использовать комбинацию JAXB, чтобы выборочно отображать данный фрагмент xml в java-объект, если вы хотите работать с ним. Вам необходимо восстановить свои классы JAXB только в случае изменения вашей схемы. Нет необходимости регенерировать, если код приложения изменяется.