从大XML文件创建JAXB对象
我正在寻找一些东西来轻松创建一个对象来访问一个大的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);
在此先感谢
这是很少手工编写JAXB类现有的XML是一个好主意。 JDK具有特殊的命令行工具,可以从XML模式为您生成这些类(xjc)。如果模式不可用,您可以尝试从XML生成模式(各种工具都可以这样做 - 例如XMLSpy),然后使用xjc生成类。
真棒...我用在线创建的xsd运行了xjc,修复了xsd中的一些小问题,现在我的孩子已经拥有了我的VZG对象。现在有没有办法再次将xsd与xml绑定以获取数据? – Philipp
不确定你的意思。也许看看Unmarshaller http://docs.oracle.com/javaee/5/tutorial/doc/bnbay.html – maximdim
是的,这是做到了。基本上这三行帮助我将来自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
请在您的问题中包含您遇到问题的确切说明。 – Perception
作为@Perception已经提到,你应该问一个问题 - 你的问题是什么? Btw:从大型XML文档中创建(基于JAXB的)对象图在大多数情况下不是一个好主意,因为您需要大量内存(RAM)。您可能需要考虑流媒体(SAX,StAX)和JAXB的组合。 – home
编辑了这个问题,使其更加清晰;我发布的代码工作顺利,sorce xml文件格式良好。我对其他解决方案持开放态度,JAXB开始似乎对我起到了很好的作用 – Philipp