使用XStream将过于复杂的XML转换为Java Object

时间:2013-12-14 12:39:05

标签: java xml xstream

我一直在使用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文件?

2 个答案:

答案 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”命名的字段将用于存储元素的文本内容,其他字段将映射到属性。