Xml 定制XStream输出

Xml 定制XStream输出,xml,collections,xml-serialization,converter,xstream,Xml,Collections,Xml Serialization,Converter,Xstream,我有一个类似这样的类: class foo { List<String> bar; ... } <foo> <bar> <blah>1</blah> <blah>2</blah> <blah>3</blah> <blah>4</blah> </bar> </foo> <

我有一个类似这样的类:

class foo {
    List<String> bar;
    ...
}
<foo>
  <bar>
     <blah>1</blah>
     <blah>2</blah>
     <blah>3</blah>
     <blah>4</blah>
  </bar>
</foo>
<foo>
  <bar>
     <blah id="1"/>
     <blah id="2"/>
     <blah id="3"/>
     <blah id="4"/>
     ...
  </bar>
</foo>
使用xstream,我成功地获得了如下输出:

class foo {
    List<String> bar;
    ...
}
<foo>
  <bar>
     <blah>1</blah>
     <blah>2</blah>
     <blah>3</blah>
     <blah>4</blah>
  </bar>
</foo>
<foo>
  <bar>
     <blah id="1"/>
     <blah id="2"/>
     <blah id="3"/>
     <blah id="4"/>
     ...
  </bar>
</foo>

1.
2.
3.
4.
但是,我需要如下所示的XML:

class foo {
    List<String> bar;
    ...
}
<foo>
  <bar>
     <blah>1</blah>
     <blah>2</blah>
     <blah>3</blah>
     <blah>4</blah>
  </bar>
</foo>
<foo>
  <bar>
     <blah id="1"/>
     <blah id="2"/>
     <blah id="3"/>
     <blah id="4"/>
     ...
  </bar>
</foo>

...

有人能帮我吗?

如果XStream不支持,可以使用。您需要使用@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; 
}
import java.util.List;
导入javax.xml.bind.annotation.*;
导入org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
福班{
@XmlPath(“bar/blah/@id”)
列表栏;
}
您可以生成以下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);
    }
}
import java.util.ArrayList;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.Marshaller;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(Foo.class);
Foo-Foo=新的Foo();
foo.bar=新的ArrayList();
foo.bar.添加(“1”);
foo.bar.添加(“2”);
foo.bar.添加(“3”);
foo.bar.添加(“4”);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
marshaller.marshall(foo,System.out);
}
}
有关更多信息,请参阅:


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

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

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

    Blah(){};

    Blah(String s) {
    this.id = s;
    }
}
2:你的foo收集了很多废话

@XStreamAlias("foo")
public class Foo {
    List<Blah> bar = new ArrayList<Blah>();
} 
4:这就是输出:

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


谢谢您的回答。我确实使用XStream
CollectionConverter
获得了所需的输出。感谢您向我展示了处理XStream的这种方法。我不知道它支持注释。我也要试试这条路。