使用XStream将过于复杂的XML转换为Java对象
我一直在使用XStream进行一些简单的XML转换,但这一次我遇到了麻烦。我试图做的是创建一个Java程序来读取和调整这种XML使用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> &
<?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中,我无法将其打印出来。