2012-07-04 12 views
1

我有此类:包装的XML输出与另一个元件

Class B { 
    private String D; 
    private String E; 
} 

使用XStream的,我想生成XML这样的,其中,元件A和B在XML生成,尽管他们不不存在于:。:

<A> 
     <B> 
       <C> 
         <D/> 
         <E/> 
       </C> 
     </B> 
</A> 

可能吗?

+0

不应该'类B'是'类C'? – biziclop

回答

1

注:我是EclipseLink JAXB (MOXy)铅和JAXB (JSR-222)专家小组的成员。

既然您正在寻找基于注解的解决方案,您可能会对MOXy中的@XmlPath扩展感兴趣。

@XmlPath注解允许你指定你的映射为一个XPath。

package forum11334385; 

import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name="A") 
@XmlAccessorType(XmlAccessType.FIELD) 
class B { 

    @XmlPath("B/C/D/text()") 
    private String D; 

    @XmlPath("B/C/E/text()") 
    private String E; 

} 

jaxb.properties

要指定莫西为您的JAXB提供你需要包括一个名为在同一个包jaxb.properties与下面进入你的领域模型文件(见:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

演示

package forum11334385; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(B.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum11334385/input.xml"); 
     B b = (B) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(b, System.out); 
    } 

} 

input.xml中/输出

<?xml version="1.0" encoding="UTF-8"?> 
<A> 
    <B> 
     <C> 
     <D>Foo</D> 
     <E>Bar</E> 
     </C> 
    </B> 
</A> 

更多信息

+1

我读过你的文章http://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-xstream.html,所以现在我发现自己倾向于JAXB。感谢分享。 –

2

您可以在XStream实例中实现并注册自定义转换器。 例如:转换器实现的

XStream xstream = new new XStream(...); 
xstream.registerConverter(new BConverter()); 
xstream.toXML(new B(),new BufferedWriter(...)); 

例子:

class BConverter implements com.thoughtworks.xstream.converters.Converter{ 

@Override 
public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext mc) { 
    B target=(B)o; 
    writer.startNode("A"); 
    writer.startNode("B"); 
    writer.startNode("C"); 
    writer.startNode("D"); 
    writer.setValue(target.getD()); 
    writer.endNode();//end node D 
    writer.startNode("E"); 
    writer.setValue(target.getE()); 
    writer.endNode();//end node E 
    writer.endNode();//end node C 
    writer.endNode();//end node B 
    writer.endNode();//end node A 
} 

@Override 
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext uc) { 
    //unmarshalizing logic here 
} 

@Override 
public boolean canConvert(Class type) { 
    return type.equals(B.class); 
} 

} 
+0

谢谢。让我看看这个。 –

+0

我已经将它标记为已接受,尽管我希望通过XStream中提供的注释来执行此操作。我真的不想写一大堆代码。但如果这是我所要做的,那就这样吧。 –

相关问题