反映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。在该标题类别中,每一个标题都有一个与前一个标题非常相似的结构(前导数字决定要解组的对象类型)
我真的只想反映一些属性,比如price,slotMax,incPad,如果可能的话,忽略其他属性。我不知道该怎么做,因为在所有解组示例中,XML都要简单得多,比如
<Employees>
<Employee>
<id>1</id>
</Employee>
<Employee>
<id>2</id>
</Employee>
</Employees>
您可能会定义一个类,比如Employees,它包含List,Employee可以被解包到。为了澄清这一点,我知道必须将RootElement设置为top元素的名称,例如在本例中的0206。img,但这怎么可能是0207年的动态
至于代码。。。我的意思是代码库非常简单,因为它只是定义要解组的结构。根据我链接的上述XML定义这种结构对我来说比较困难
# 1 楼答案
如果您只对几个易于检测的元素感兴趣,而不是对整个结构感兴趣,那么JAXB可能是一个错误的工具。JAXB适用于有XML模式、对(或多或少)完整结构、解组和编组感兴趣的情况
如果您只需要XML的几个部分,那么有更简单的方法可以做到这一点。在这种情况下,我可能会使用STAX。大致如下:
打印所有
int
元素的名称/值对。可以很容易地扩展到其他情况。速度非常快,没有JAXB开销,可以轻松处理大型XML文件,无论文件有多大还有其他工具。有一个解析器(我记不起它的名字)定义基于XPath的规则,解析器根据这些规则返回数据。那也很合适,但我不记得名字了。我想这是一个Apache项目
更新:我终于找到了,我说的是Digester。它允许配置类似XPath的绑定规则,并为您创建对象。不过,我可能会继续使用STAX解决方案,除非你确定你会得到越来越复杂的规则