【问题标题】:Create JAXB Object from large XML file从大型 XML 文件创建 JAXB 对象
【发布时间】: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,看起来也不错,够了吗?

标签: java xml object jaxb


【解决方案1】:

为现有的 XML 手动编写 JAXB 类并不是一个好主意。 JDK 具有特殊的命令行工具,可以从 XML 模式为您 (xjc) 生成这些类。如果架构不可用,您可以尝试从 XML 生成架构(各种工具都可以做到这一点 - 例如 XMLSpy),然后使用 xjc 生成类。

【讨论】:

  • 太棒了...我使用在线创建的 xsd 运行 xjc,修复了 xsd 中的一些小问题,现在我有了我的 VZG 对象和孩子们。现在有什么办法可以再次绑定xsd和xml来获取数据吗?
  • 不确定你的意思。也许看看 Unmarshaller docs.oracle.com/javaee/5/tutorial/doc/bnbay.html
  • 是的,做到了。基本上,这三行帮助我将 xsd 创建的对象与 xml 绑定回来: jc = JAXBContext.newInstance(Vzg.class);解组器 u = jc.createUnmarshaller(); xml = (Vzg) u.unmarshal(new FileInputStream("###.xml"));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多