自定义XStream输出

时间:2010-09-16 07:05:52

标签: xml collections xml-serialization converter xstream

我有一个类似于这样的课程:

class foo {
    List<String> bar;
    ...
}

我在列表bar中添加了四个字符串:

bar.add("1");
bar.add("2");
bar.add("3");
bar.add("4");

使用xstream,我设法得到如下输出:

<foo>
  <bar>
     <blah>1</blah>
     <blah>2</blah>
     <blah>3</blah>
     <blah>4</blah>
  </bar>
</foo>

但是,我需要看起来像这样的XML:

<foo>
  <bar>
     <blah id="1"/>
     <blah id="2"/>
     <blah id="3"/>
     <blah id="4"/>
     ...
  </bar>
</foo>

有人可以帮我吗?

2 个答案:

答案 0 :(得分:3)

您可以通过执行以下操作获得所需的输出:

1:创建Blah类,除非您希望所有字符串都显示为属性。

@XStreamAlias("blah")
public class Blah {
    @XStreamAsAttribute
    String id;

    Blah(){};

    Blah(String s) {
    this.id = s;
    }
}

2:你的foo有一些blahs

@XStreamAlias("foo")
public class Foo {
    List<Blah> bar = new ArrayList<Blah>();
} 

3:告诉XStream处理注释

XStream xstream = new XStream();
xstream.processAnnotations(Foo.class);
xstream.processAnnotations(Blah.class);
System.out.println(xstream.toXML(f));

4:这是输出:

<foo>
  <bar>
    <blah id="1"/>
    <blah id="2"/>
    <blah id="3"/>
    <blah id="4"/>
  </bar>
</foo>

答案 1 :(得分:0)

如果XStream不支持,可以使用MOXy JAXB完成。您需要使用@XmlPath注释:

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

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class Foo {
    @XmlPath("bar/blah/@id")
    List<String> bar; 
}

您可以生成以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
   <bar>
      <blah id="1"/>
      <blah id="2"/>
      <blah id="3"/>
      <blah id="4"/>
   </bar>
</foo>

使用此演示代码:

import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

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

        Foo foo = new Foo();
        foo.bar = new ArrayList<String>();
        foo.bar.add("1"); 
        foo.bar.add("2"); 
        foo.bar.add("3"); 
        foo.bar.add("4"); 

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

有关详细信息,请参阅: