使用JAXB将img.Xml反映到Java对象中

时间:2018-05-09 06:34:22

标签: java jaxb

所以我在Unity中从C#过渡,在XML中反射很容易。我想在Java中将相同的过程应用于这种格式的现有XML的稍微变化的版本:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<imgdir name="0206.img">
  <imgdir name="02060003">
    <imgdir name="info">
      <canvas name="icon" width="32" height="32">
        <vector name="origin" x="0" y="32" />
      </canvas>
      <canvas name="iconRaw" width="32" height="31">
        <vector name="origin" x="0" y="32" />
      </canvas>
      <int name="price" value="20" />
      <int name="slotMax" value="1000" />
      <int name="incPAD" value="4" />
    </imgdir>
    <imgdir name="bullet">
      <canvas name="0" width="43" height="18">
        <vector name="origin" x="23" y="10" />
        <int name="z" value="0" />
      </canvas>
      <canvas name="1" width="41" height="9">
        <vector name="origin" x="22" y="5" />
        <int name="z" value="0" />
      </canvas>
    </imgdir>
  </imgdir>
  <imgdir name="02060005">
    <imgdir name="info">
      <canvas name="icon" width="26" height="25">
        <vector name="origin" x="-3" y="25" />
        <int name="z" value="0" />
      </canvas>
      <canvas name="iconRaw" width="20" height="18">
        <vector name="origin" x="-6" y="25" />
        <int name="z" value="0" />
      </canvas>
      <int name="slotMax" value="800" />
      <int name="incPAD" value="10" />
      <int name="reqLevel" value="10" />
      <int name="tradeBlock" value="1" />
    </imgdir>
    <imgdir name="bullet">
      <canvas name="0" width="36" height="19">
        <vector name="origin" x="22" y="9" />
        <int name="delay" value="150" />
      </canvas>
      <canvas name="1" width="40" height="22">
        <vector name="origin" x="20" y="11" />
        <int name="delay" value="150" />
      </canvas>
      <canvas name="2" width="43" height="21">
        <vector name="origin" x="21" y="10" />
        <int name="delay" value="150" />
      </canvas>
      <canvas name="3" width="46" height="23">
        <vector name="origin" x="20" y="11" />
        <int name="delay" value="150" />
      </canvas>
    </imgdir>
    <imgdir name="hit">
      <canvas name="0" width="55" height="38">
        <vector name="origin" x="13" y="20" />
        <int name="delay" value="90" />
      </canvas>
      <canvas name="1" width="43" height="55">
        <vector name="origin" x="17" y="29" />
        <int name="delay" value="100" />
      </canvas>
      <canvas name="2" width="51" height="65">
        <vector name="origin" x="26" y="34" />
        <int name="delay" value="100" />
      </canvas>
      <canvas name="3" width="62" height="87">
        <vector name="origin" x="34" y="57" />
        <int name="delay" value="100" />
      </canvas>
    </imgdir>
  </imgdir>

问题是这些XML文件很多,每个文件都有不同的标题名称,例如0206.img,0207.img。每个标题类别中的每一个都具有与前一个非常相似的结构(前导数字确定它是什么类型的对象解组)。

我真的只想反映 price slotMax incPad 等属性,如果可能,请忽略其余属性。我不知道如何解决这个问题,因为在所有的unmarshal示例中,XML更简单,例如

<Employees>
    <Employee>
       <id>1</id>
    </Employee>
    <Employee>
      <id>2</id>
    </Employee>
</Employees>

您可能会定义一个类似Employees的类,其中包含List,而Employee可以被解组为。为了澄清,我知道你必须将RootElement设置为顶部元素的名称,例如在这种情况下为0206.img,但这对于0207是如何动态的?

至于代码......我的意思是代码库非常简单,因为它只是定义要解组的结构。根据我链接的上述XML定义这个结构对我来说更难。

1 个答案:

答案 0 :(得分:0)

如果您只对一些易于检测的元素感兴趣,而不是对整个结构感兴趣,那么JAXB可能是一个错误的工具。 JAXB适用于您拥有XML Schema,对(或多或少)完整结构,解组以及编组感兴趣的情况。

如果您只需要XML的一些部分,那么有更简单的方法可以做到这一点。在这种特殊情况下,我可能会使用STAX。一些事情:

private static final QName INT_ELEMENT_NAME = new QName("int");

// ...

    XMLInputFactory factory = XMLInputFactory.newInstance();
    XMLStreamReader reader = factory.createXMLStreamReader(is);

    while (reader.hasNext()) {
        if (XMLStreamConstants.START_ELEMENT == reader.next()) {
            if (Objects.equals(INT_ELEMENT_NAME, reader.getName())) {
                String name = reader.getAttributeValue(null, "name");
                String value = reader.getAttributeValue(null, "value");
                System.out.println(name + "=" + value);
            }
        }
    }

从所有int元素打印名称/值paits。可以轻松扩展到更多案例。非常快,没有JAXB开销,很容易使用大型XML文件,无论多大。

还有其他工具。有一个解析器(我记不住名称),您在其中定义基于XPath的规则,解析器根据这些规则返回数据。这也是合适的,但我不记得这个名字。我认为这是一个Apache项目。

更新:我终于找到了,我在谈论Digester。它允许为您配置类似XPath的绑定规则和创建对象。不过,除非你确定你会得到越来越复杂的规则,否则我可能会继续使用STAX解决方案。