import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.Arrays;
import java.util.List;
public class ListStrTest2 {
public static void main(String[] args) {
Request request = new Request();
request.setId(1L);
request.setStreetLines(Arrays.asList("line1","line2"));
System.out.println(request.toXmlString());
}
@Data
@XmlRootElement()
@XStreamAlias("Request")
public static class Request {
private Long Id;
private List<String> StreetLines;
public String toXmlString() {
XStream xstream = new XStream();
xstream.processAnnotations(Request.class);
xstream.aliasSystemAttribute(null, "class");
String s = xstream.toXML(this);
return s;
}
}
}
打印结果是
<Request>
<Id>1</Id>
<StreetLines>
<a>
<string>line1</string>
<string>line2</string>
</a>
</StreetLines>
</Request>
我想要的结果是
<Request>
<Id>1</Id>
<StreetLines>
<string>line1</string>
<string>line2</string>
</StreetLines>
</Request>
不要a标签。
注意不用手动replace
Arrays.asList("line1","line2");生成的集合是java.util.Arrays中的静态内部类ArrayList,里边的元素存储在属性名为a的数组中,所以生成的xml有a标签。测试换用java.util.ArrayList正常,猜测对java.util.ArrayList做了处理。如果坚持要用java.util.Arrays$ArrayList可以添加xstream.addImplicitArray(Class.forName("java.util.Arrays$ArrayList"),"a");来达到效果。
写了个小例子,用dom4j来实现,先把string转成Document对象,然后拿到a和StreetLines的Element,从StreetLines里删除a,并且把a的子Element加入到StreetLines
String xmlString = "<Request>\r\n"
+ " <Id>1</Id>\r\n"
+ " <StreetLines>\r\n"
+ " <a>\r\n"
+ " <string>line1</string>\r\n"
+ " <string>line2</string>\r\n"
+ " </a>\r\n"
+ " </StreetLines>\r\n"
+ "</Request>\r\n"
+ " ";
Document doc = null;
try {
doc = DocumentHelper.parseText(xmlString);
} catch (DocumentException e) {
e.printStackTrace();
}
Element root = doc.getRootElement();
Element StreetLines = root.element("StreetLines");
Element element_a = StreetLines.element("a");
StreetLines.remove(element_a);
StreetLines.setContent(element_a.elements());
System.out.println(doc.asXML());