我有一个类似于这样的课程:
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>
有人可以帮我吗?
答案 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);
}
}
有关详细信息,请参阅: