我一直在使用XStream进行一些简单的XML转换,但我一直坚持这个。我要做的是创建一个Java程序来读取和调整这种XML;
<?xml version="1.0" encoding="utf-8"?>
<actor id="id273212" PGFVersion="0.19" GSCVersion="0.10.4">
<attributes>
<text id="name">Actor 1c</text>
<real id="time">0</real>
<point id="position">
<real id="x">0</real>
<real id="y">0</real>
</point>
<size id="size">
<real id="width">120</real>
<real id="height">120</real>
</size>
<angle id="rotation">0</angle>
<color id="color">
<real id="red">1</real>
<real id="green">1</real>
<real id="blue">1</real>
<real id="alpha">1</real>
</color>
<image id="image" />
<text id="tags" />
<boolean id="preloadArt">true</boolean>
</attributes>
<behaviors />
<aspects>
<graphics>
<attributes>
<boolean id="visible">true</boolean>
<enumeration id="blendingMode">0</enumeration>
<enumeration id="horizontalWrap">0</enumeration>
<enumeration id="verticalWrap">0</enumeration>
<enumeration id="horizontalAnchor">0</enumeration>
<enumeration id="verticalAnchor">0</enumeration>
<boolean id="flipHorizontally">false</boolean>
<boolean id="flipVertically">false</boolean>
<integer id="tileWidth">0</integer>
<integer id="tileHeight">0</integer>
</attributes>
</graphics>
<motion>
<attributes>
<point id="linearVelocity">
<real id="x">0</real>
<real id="y">0</real>
</point>
<real id="angularVelocity">0</real>
<real id="maxSpeed">0</real>
<boolean id="applyMaxSpeed">false</boolean>
</attributes>
</motion>
<physics>
<attributes>
<real id="density">1</real>
<real id="friction">3</real>
<real id="restitution">1</real>
<boolean id="fixedRotation">false</boolean>
<boolean id="movable">true</boolean>
<enumeration id="collisionShape">0</enumeration>
<real id="drag">0</real>
<real id="angularDrag">0</real>
</attributes>
</physics>
</aspects>
</actor>
我无法理解该怎么做:<text id="name">Actor 1c</text>
我能得到的最接近的是:
<text id="name">
<variables>Actor 1c</variables>
</text>
我做的是,我创建了一个“文本”类,它接受一个字符串(“Actor 1c”)为'变量'。
我尝试使用“addImplicitCollection”,但它不起作用。我知道这个问题没有一个简单的答案,但我应该如何构建我的Java以便我可以阅读这些XML文件?
答案 0 :(得分:0)
对我来说,这里最难的部分是<attributes>
的地图,它可以存储复杂的物体。在Java中,这将看起来像对象的HashMap。现在,您的属性具有id,这将是此哈希映射条目的关键。这意味着您很可能需要为XML节点定制转换器。
根据我对这些文档的经验,它不是很有效率,我总是最终研究XML工具实现细节,以了解它为什么不起作用。另一个问题是,XML文档可能会在某些部分变得富有创意,特别是在没有模式的情况下,这些工具并不受欢迎。
所以我建议尝试用StAX解析器解析它 - 走树并手动转换节点。或者将其转换为DOM树,然后将DOM树转换为对象。
答案 1 :(得分:0)
XStream的ToAttributedValueConverter可以在这里为您提供帮助:
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"value"})
@XStreamAlias("text")
public class Text {
private String value;
private String id;
// getters/setters/etc. as appropriate
}
“strings”命名的字段将用于存储元素的文本内容,其他字段将映射到属性。