所以我在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定义这个结构对我来说更难。
答案 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解决方案。