有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

反映img。使用JAXB将Xml转换为Java对象

所以我从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。在该标题类别中,每一个标题都有一个与前一个标题非常相似的结构(前导数字决定要解组的对象类型)

我真的只想反映一些属性,比如priceslotMaxincPad,如果可能的话,忽略其他属性。我不知道该怎么做,因为在所有解组示例中,XML都要简单得多,比如

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

您可能会定义一个类,比如Employees,它包含List,Employee可以被解包到。为了澄清这一点,我知道必须将RootElement设置为top元素的名称,例如在本例中的0206。img,但这怎么可能是0207年的动态

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


共 (1) 个答案

  1. # 1 楼答案

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

    如果您只需要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元素的名称/值对。可以很容易地扩展到其他情况。速度非常快,没有JAXB开销,可以轻松处理大型XML文件,无论文件有多大

    还有其他工具。有一个解析器(我记不起它的名字)定义基于XPath的规则,解析器根据这些规则返回数据。那也很合适,但我不记得名字了。我想这是一个Apache项目

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