2012-11-06 115 views
1

我正在尋找一些東西來輕鬆創建一個對象來訪問一個大的XML文件。從大XML文件創建JAXB對象

的XML文件是這樣的:

<?xml version="1.0" encoding="WINDOWS-1252"?> 
    <vzg:vzg erstellt_von="##" erstellt_am="###" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:vzg="###" xsi:schemaLocation="###"> 
     <auswahl sicht="B" basisfplp_id="0" basisve_id="0"> 
     <fplp vzg_id="0" periode="2012/2013"/> 
     <version vzg_id="###" name="###"/> 
     <strecke name="11801"> 
      <von baukms_nr="###" km="#.#"/> 
      <bis baukms_nr="###" km="#.#"/> 
     </strecke> 
     <bst vzg_id="#" name="#" kurzbez="##" bez="####" kritart="#"/> 
     <bst vzg_id="#" name="#" kurzbez="##" bez="####" kritart="#"/> 
     <bst vzg_id="#" name="#" kurzbez="##" bez="####" kritart="#"/> 
     <bst vzg_id="#" name="#" kurzbez="##" bez="####" kritart="#"/> 
     <bst vzg_id="#" name="#" kurzbez="##" bez="####" kritart="#"/> 
     ... 

我希望對象與一些XML屬性的計算。

喜歡:

列表vzg_id = vzg.auswahl.bst;

int res = vzg_id.get(3)* vzg.auswahl.strecke.von.baukms_nr;

由於XML約有16000行,因此很難爲每個XMLElement創建一個類。

我現在已經完成:

MainClass

import java.util.ArrayList; 
import java.util.List; 

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

import java.io.File; 

import javax.xml.bind.JAXB; 

public class Main 
{ 
    public static void main(String[] args) 
    { 
     VZG vzg = JAXB.unmarshal(new File("./XMLVZG.xml"), VZG.class); 


     System.out.println(vzg.erstellt_am+ " "+vzg.erstellt_von+"\n"+vzg.aw.sicht); 
    } 
} 

類VZG

import java.util.ArrayList; 
import java.util.List; 

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class VZG 
{ 
    @XmlElement(name="auswahl") 
    AuswahlSicht aw; 
    @XmlAttribute(name="erstellt_von") 
    String erstellt_von; 
    @XmlAttribute(name="erstellt_am") 
    String erstellt_am; 
    @XmlAttribute(name="xsi") 
    String xmlns_xsi; 
} 

類Auswahl

import java.util.List; 

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="auswahl") 
public class AuswahlSicht 
{ 
    @XmlAttribute(name="basisfplp_id") 
    int basisfplp_id; 
    @XmlAttribute(name="basisve_id") 
    int basisve_id; 
    @XmlAttribute(name="sicht") 
    String sicht; 

} 

所以我現在能拿到的屬性Root和Cild,但我仍有大約1000個子屬性剩下,我正在尋找一種自動的方式來解析XML以獲取對象。 簡單說明: XML文件

<root> 
<child> 
    <Subchild id="1"/> 
    <subsubchild id=2/> 
    <subsubchild id=33/> 
</child> 
</root> 

那麼對象應該是這樣的:

列表subsubchilds = root.child.subchild.subsubchild; int id_one = subsubchilds.get(0);

在此先感謝

+1

請在您的問題中包含您遇到問題的確切說明。 – Perception

+1

作爲@Perception已經提到,你應該問一個問題 - 你的問題是什麼? Btw:從大型XML文檔中創建(基於JAXB的)對象圖在大多數情況下不是一個好主意,因爲您需要大量內存(RAM)。您可能需要考慮流媒體(SAX,StAX)和JAXB的組合。 – home

+0

編輯了這個問題,使其更加清晰;我發佈的代碼工作順利,sorce xml文件格式良好。我對其他解決方案持開放態度,JAXB開始似乎對我起到了很好的作用 – Philipp

回答

3

這是很少手工編寫JAXB類現有的XML是一個好主意。 JDK具有特殊的命令行工具,可以從XML模式爲您生成這些類(xjc)。如果模式不可用,您可以嘗試從XML生成模式(各種工具都可以這樣做 - 例如XMLSpy),然後使用xjc生成類。

+0

真棒...我用在線創建的xsd運行了xjc,修復了xsd中的一些小問題,現在我的孩子已經擁有了我的VZG對象。現在有沒有辦法再次將xsd與xml綁定以獲取數據? – Philipp

+0

不確定你的意思。也許看看Unmarshaller http://docs.oracle.com/javaee/5/tutorial/doc/bnbay.html – maximdim

+0

是的,這是做到了。基本上這三行幫助我將來自xsd創建的對象與xml綁定在一起:jc = JAXBContext.newInstance(Vzg.class); \t \t \t Unmarshaller u = jc.createUnmarshaller(); \t \t \t xml =(Vzg)u.unmarshal(new FileInputStream(「###。xml」)); – Philipp