我肯定是了解Xstream转换器的问题。
我有一个非常复杂的XML来自传统的后台应用程序,只是想将这个转换为更简单的java类或带转换器的Map。
我的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类。
答案 0 :(得分:1)
似乎您希望xml结构不会反映在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();
}
您将定义接口而不是类,但这些接口的实例可以像POJO一样使用。 (使用toString(),equals(),hashCode,...)。 创建这些接口的实例如下:
Agent agent = new XBProjector().io().stream(stream).read(Agent.class);