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);
}
}
有关更多信息,请参阅:
@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>
谢谢您的回答。我确实使用XStreamCollectionConverter
获得了所需的输出。感谢您向我展示了处理XStream的这种方法。我不知道它支持注释。我也要试试这条路。