我对 Xstream 转换器的理解肯定有问题。
我有一个来自遗留后台应用程序的非常复杂的 XML,并且只想将其转换为更简单的 java 类或带有转换器的 Map。
- 我不想编码为 XML,只是解码
- 我不想使用注释,只是 KISS
我的 XML 就像
<root>
<agent>
<id>123456789</id>
<name>GABIN</name>
<forname>Jean</forname>
<unit>
<legacyReference>AA</legacyReference>
<name>SAN ANTONIO</name>
<legacyName>SA</legacyName>
<address>
<number>1</number>
<street>Sesam street</street>
<city>NoWhere</city>
<legacyID>AAZE-56</legacyID>
</address>
<legacyStructurBlablabla>
<type>OFFICE</type>
<data>
<foo>BAR</foo>
</data>
</legacyStructurBlablabla>
<...>
</unit>
<...>
</agent>
</root>
我的目标类非常简单
class Agent {
String id;
String name;
String forname;
String unitName;
String unitType;
<...>
}
我的主要方法看起来像
xStream = new XStream(new DomDriver());
stream = this.getClass().getClassLoader().getResourceAsStream("data/agent.xml") ;
xStream.alias("root", Map.class);
xStream.alias("agent", Agent.class);
xStream.registerConverter(new ResultConverter());
xStream.registerConverter(new AgentConverter());
xStream.ignoreUnknownElements();
Object obj = xStream.fromXML(stream);
我不明白如何下台转而支持另一个转换器。
public class ResultConverter implements Converter {
...
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
Map<String, Object> agents = new HashMap<String, Object>();
while( reader.hasMoreChildren() ) {
reader.moveDown();
// HOW I DO TO STEP DOWN IN FAVOR OF Agent CONVERTER ?
reader.moveUp();
}
return agents;
}
我没有看到 Xstream 向下滚动以激活我的 AgentConverter。
我肯定没有捕获要点
编辑
Xstream 可能不是适合此目的的工具。 根据 Cfx 的建议,我会使用 xmlbeam。 XMLBeam 根据 XPATH 映射将 XML 投影到 Java 类。
最佳答案
似乎您不希望 xml 结构反射(reflect)在您的 Java 类中。如果你坚持使用XStream,我没有解决办法。但有一个alternative framework正是为了解决这个问题而制定的。它使用注释,但恕我直言,并没有违反 KISS 原则。 这是一个例子:
public interface Agent {
@XBRead("/root/agent/id")
String getId();
@XBRead("/root/agent/name")
String getName();
@XBRead("/root/agent/forename")
String getForname();
@XBRead("/root/agent/unit/name")
String getUnitName();
@XBRead("/root/agent/unit/legacyStructurBlablabla/type")
String getUnitType();
}
您将定义接口(interface)而不是类,但这些接口(interface)的实例可以像 POJO 一样使用。 (使用 toString()、equals()、hashCode,...)。 创建这些接口(interface)的实例如下:
Agent agent = new XBProjector().io().stream(stream).read(Agent.class);
关于java - xstream 使用 Converter 将复杂的 XML 反序列化为更简单的 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27605152/