xstream使用转换器将复杂XML非序列化为更简单的java
我对Xstream转换器的理解肯定有问题xstream使用转换器将复杂XML非序列化为更简单的java,java,xml,xml-parsing,xstream,Java,Xml,Xml Parsing,Xstream,我对Xstream转换器的理解肯定有问题 public class ResultConverter implements Converter { ... public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { Map<String, Object> agents = new HashMap<String, Object>(
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;
}
我有一个非常复杂的XML来自遗留的后台应用程序,我只想将它转换成一个更简单的java类或带有转换器的映射
<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>
我不明白如何下台,转而支持另一个转换器
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;
}
公共类ResultConverter实现转换器{
...
公共对象解组(HierarchycalStreamReader,
解组(上下文){
映射代理=新的HashMap();
while(reader.hasMoreChildren()){
reader.moveDown();
//我该怎么做才能退下来支持代理转换器?
reader.moveUp();
}
退货代理;
}
我没有看到Xstream滚动dow thierarchy来激活我的代理转换器
我肯定没有抓住要点
编辑
Xstream可能不是用于此目的的正确工具。
根据Cfx advise,我会使用xmlbeam。
XMLBeam根据XPATH映射将XML投影到Java类。似乎您不希望XML结构反映在Java类中。如果您坚持使用XStream,我没有解决方案。但有一个解决方案正好解决了这个问题。它使用注释,但IMHO没有违反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);
回答得好。你说得对,这可能是解决我问题的正确方法。我试试看。谢谢但是我必须使用中间接口来支持项目列表吗?作为公共接口代理列表{@XBRead(“/root/agent”)公共列表getAgents();}是的,但您可能会使用一个技巧:重用代理接口并将getAgents()方法仅添加到代理接口本身。这不是简单的OO,但效果很好。听到这个消息我很高兴。谢谢你尝试一下。请随时联系我(通过github或项目站点)以获得进一步的支持。还有更多,例如动态投影或通过XPath创建XML。
Agent agent = new XBProjector().io().stream(stream).read(Agent.class);