【发布时间】:2012-11-07 00:19:58
【问题描述】:
我正在寻找可以轻松创建对象以访问大型 XML 文件的方法。
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 创建一个类。
我现在做了什么:
主类
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;
}
类奥斯瓦尔
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);
提前致谢
【问题讨论】:
-
请在您的问题中准确描述您遇到的问题。
-
正如@Perception 已经提到的,你应该问一个问题——你的问题是什么?顺便说一句:从一个巨大的 XML 文档创建(基于 JAXB)对象图在大多数情况下不是一个好主意,因为您需要大量内存 (RAM) 来实现这一点。您可能需要考虑将流(SAX、StAX)和 JAXB 结合起来。
-
编辑了问题以使其更加清晰;我发布的代码运行流畅,sorce xml 文件格式正确。我对其他解决方案持开放态度,起初 JAXB 似乎对我很有效
-
能否请创建数据的人为您提供 XSD?然后你就可以生成类了。
-
@DaveRlz 原始 xsd 不可用。我在网上做了一个xsd,看起来也不错,够了吗?