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

使用XStream将过于复杂的XML转换为Java对象,java,xml,xstream,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> &

我一直在使用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>
我不明白怎么做:演员1c

我能得到的最接近的结果是:

  <text id="name">
    <variables>Actor 1c</variables>
  </text>
我所做的是,我创建了一个文本类,它将字符串接受为“变量”


我尝试使用addImplicitCollection,但它不起作用。我知道这个问题没有一个简单的答案,但我应该如何构建我的Java以便能够读取这些XML文件?

对我来说,这里最难的部分是一个可以存储复杂对象的映射。在Java中,这看起来像是对象的HashMap。现在,您的属性具有ID,这将是此哈希映射项的键。这意味着您可能需要为XML节点定制转换器

根据我使用此类文档的经验,它的效率不高,我总是研究XML工具的实现细节来理解它为什么不起作用。另一个问题是XML文档的某些部分可能会变得有创意,特别是在没有模式的情况下,而这正是工具不太欢迎的

所以我建议尝试用一个StAX解析器来解析它——遍历树并手动转换节点。或者将其转换为DOM树,然后将DOM树转换为对象。

XStream's可以帮助您:

@XStreamConverter(value=ToAttributedValueConverter.class, strings={"value"})
@XStreamAlias("text")
public class Text {
  private String value;
  private String id;

  // getters/setters/etc. as appropriate
}

以字符串命名的字段将用于存储元素的文本内容,其他字段将映射到属性。

您能告诉我更多详细信息吗?我是否应该生成->public to attributedValueConverterClass类型、映射器映射器、ReflectionProvider ReflectionProvider、ConverterLookup、StringvalueFieldName@canberk你不需要建造任何东西,ToAttributedValueConverter是一个标准的XStream类,在类上放置@XStreamConverter注释应该足以激活它。和往常一样,当您使用基于注释的配置进行读取时,您还需要调用xstream.processAnnotationsText.class,对于任何其他已注释的类,也需要调用xstream.processAnnotationsText.class。您描述的是使用xstream.useAttributeForPhoneNumber.class,type;我已经能做到了。当我有文本1=新文本这样的东西时;在PhoneNumber中,我无法将其打印出来。