如何实现任意对象转换为XML格式

wzrlover 2006-03-27 01:35:45
求实现将任意对象(MapToXML,ArrayListToXML,collectionToXML,BeanToXML等)转换为XML格式字符串的方法或工具
如,
Map userMap=new HashMap();
userMap.put("username","test");
userMap.put("sex","1");
UserMap.put("collection",myArrayList);
XMLUtil.toXML(userMap,"User");
得到的结果:
<User>
<username>test</username>
<sex>1</sex>
<collection>
//集合内容
……
</collection>
</User>

当然如果复杂对象里包含着集合也可以正确转换为XML,如有这类的开源工具也可
(xstream 可以实现javabean to xml的转换,但是没办法用Map ,ArrayList转换为如上格式的数据)
...全文
2758 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfchjk 2006-05-02
  • 打赏
  • 举报
回复
mark
jiang_xiao 2006-04-14
  • 打赏
  • 举报
回复
mark下
xueyi0108 2006-04-13
  • 打赏
  • 举报
回复
mark 学习~
hesandy 2006-04-03
  • 打赏
  • 举报
回复
castor 数据邦定可以实现,你要定义自己的schema。
wmzsl 2006-04-03
  • 打赏
  • 举报
回复
顶一下
wzrlover 2006-04-03
  • 打赏
  • 举报
回复
以上主要是以
<item>
<name></name>
<value></value>
</item>
这种格式,实现Map包含了Collection或Collection包含了Map等结构的XML输出
wzrlover 2006-04-03
  • 打赏
  • 举报
回复
我说了,xstream实现的并不符合我的要求,后来自己写了一个,只是针对Map/Collection对象,
对于JavaBean其实很多工具都可以实现,这不是问题:
XMLHelper.Java


import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
*
* <pre>
* project:
* Title:XMLHelper
* Description:将对象(Map,Collection)转换为Ajax XML输出帮助工具类
* </pre>
* @author wzrlover
* @since 2006-4-1
*/
public class XMLHelper {
private static XMLHelper helper=new XMLHelper();
private XMLHelper(){

}
public static XMLHelper getInstance(){
return helper;
}

public String toXML(Object _obj){
StringBuffer xml = new StringBuffer().append("<?xml version=\"1.0\"");
xml.append(" encoding=\"");
xml.append("utf-8");
xml.append("\"");
xml.append(" ?>\n");
xml.append("<ajax-response>\n");
xml.append("<response>\n");
xml.append(this.toXML(_obj,0));
xml.append("</response>\n");
xml.append("</ajax-response>");
return xml.toString();
}
private String toXML(Object _obj, int i) {
String str=null;
if (_obj instanceof Map) {
str = toXMLMap((Map)_obj, i);
} else if (_obj instanceof Collection) {
str = toXMLCollection((Collection)_obj, i);
}else{
str = toXMLOtherObject( _obj, i);
}
return str;
}

private String toXMLCollection(Collection _list, int i) {
StringBuffer sb = new StringBuffer();
if(_list!=null) {
sb.append(getSpace(i)).append("<item>").append("\n");
for (Iterator it = _list.iterator(); it.hasNext(); ) {
i++;
sb.append(toXML(it.next(), i));
i--;
}
sb.append(this.getSpace(i)).append("</item>").append("\n");
}
return sb.toString();
}

private String toXMLMap(Map _map, int i) {
StringBuffer sb = new StringBuffer();
if(_map!=null) {
Set keySet = _map.keySet();
for (Iterator it = keySet.iterator(); it.hasNext(); ) {
Object key = it.next();
Object value=_map.get(key);
i++;
sb.append(getSpace(i)).append("<item id='").append(key+"'>").append("\n");
//如果Map里的value对象是Collection或Map,则不添加<name/>
if(!(value instanceof Map) &&!( value instanceof Collection)){
sb.append(getSpace(i) + "<name>" + key).append("</name>").append("\n");
}
sb.append(toXML(_map.get(key), i));
sb.append(getSpace(i)).append("</item>").append("\n");
i--;

}
}
return sb.toString();
}

private String toXMLOtherObject(Object _obj, int i) {
StringBuffer sb = new StringBuffer();
sb.append(this.getSpace(i));
if(_obj!=null) {
sb.append("<value>").append(_obj.toString()).append("</value>").append("\n");
}
return sb.toString();
}
private String getSpace(int _i) {
StringBuffer sb = new StringBuffer();
for (int j = 0; j < _i; j++) {
sb.append(" ");
}
return sb.toString();
}

}
foxty 2006-04-01
  • 打赏
  • 举报
回复
何必这么麻烦,直接可以用XStream帮你做,很简单的实现。

http://xstream.codehaus.org/

http://xstream.codehaus.org/tutorial.html 《==很容易就可以实现了。
YuLimin 2006-04-01
  • 打赏
  • 举报
回复
这是一个不错的问题,各位回贴也很积极,提交公告

也可以看看XMLBeans的实现

XMLBeans是一个XML-Java绑定工具,利用它可以很方便地解析XML文档。

http://xmlbeans.apache.org/
jiangwenfeng762 2006-03-31
  • 打赏
  • 举报
回复
我的程序还很不完善,不具备很强的通用性,只能满足基本的需求,这个程序要求Map中的数据类型只能是:1)List;2)Map;3)String,其他的则无法处理。这个程序的基本想法是用递归的思想不断的构建document,直到Map中的所有数据遍历完毕。最终返回构建好的document对象。
gougou8180 2006-03-31
  • 打赏
  • 举报
回复
看的头都痛了。。。

我就只会用dom读xml文件
jiangwenfeng762 2006-03-31
  • 打赏
  • 举报
回复
//这是我根据楼主的需求写的
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
public class Test {
public static void main(String[] args) {
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document document = builder.newDocument();
Element root = document.createElement("Object");
root.setNodeValue("");
Map map = new HashMap();
map.put("name", "JiangWf");
map.put("age", "26");
List books = new ArrayList(4);
books.add("english_book");
books.add("computer_book");
books.add("chinese_book");
List books2 = new ArrayList(2);
books2.add("java_books");
books2.add("VB_books");
books.add(books2);
map.put("books", books);
Map m = new HashMap();
m.put("map1",books2);
m.put("map2","hello");
map.put("map",m);
document = new Test().mapDataToXml(map, root, document);
} catch (Exception e) {
e.printStackTrace();
}
}
public Document mapDataToXml(Map datas, Element root, Document doc)
throws Exception {
if (datas == null || datas.isEmpty() || root == null) {
return null;
}
Set keyset = datas.keySet();
Iterator iterator = keyset.iterator();
Object key = null;
Object value = null;
while (iterator.hasNext()) {
key = iterator.next();
value = datas.get(key);
Element element = doc.createElement((String) key);
root.appendChild(element);
if (value instanceof List) {
doc = listDatasToXml((List) value, element, doc);
} else if (value instanceof Map) {
doc = mapDataToXml((Map) value, element, doc);
} else if (value instanceof String) {
element.appendChild(doc.createTextNode((String) value));
} else {
System.out.println("Error: error type");
continue;
}
}
return doc;
}
private Document listDatasToXml(List datas, Node parent, Document doc)
throws Exception {
if (datas == null || datas.isEmpty() || parent == null) {
return null;
}
Object item = null;
for (int i = 0; i < datas.size(); i++) {
item = datas.get(i);
if (item instanceof String) {
Element element = doc.createElement((String) item);
element.appendChild(doc.createTextNode((String) item));
parent.appendChild(element);
} else if (item instanceof List) {
Element element = doc.createElement("list");
element.setNodeValue("");
parent.appendChild(element);
doc = listDatasToXml((List) item, element, doc);
} else if (item instanceof Map) {
Element element = doc.createElement("map");
element.setNodeValue("");
parent.appendChild(element);
doc = mapDataToXml((Map) item, element, doc);
} else {
System.out.println("Error: unlegal type.");
continue;
}
}
return doc;
}
}
//下面是程序测试结果
<Object>
<age>26</age>
<books>
<english_book>english_book</english_book>
<computer_book>computer_book</computer_book>
<chinese_book>chinese_book</chinese_book>
<list>
<java_books>java_books</java_books>
<VB_books>VB_books</VB_books>
</list>
</books>
<map>
<map1>
<java_books>java_books</java_books>
<VB_books>VB_books</VB_books>
</map1>
<map2>hello</map2>
</map>
<name>JiangWf</name>
</Object>
wzrlover 2006-03-31
  • 打赏
  • 举报
回复
谢谢各位!有心了!我会逐一尝试,谢谢!
lydvqq 2006-03-28
  • 打赏
  • 举报
回复
哦,明白了,刚看错了。先写了。
lydvqq 2006-03-28
  • 打赏
  • 举报
回复
XStream不知可不可以?
wzrlover 2006-03-28
  • 打赏
  • 举报
回复
如 list.add("a");
list.add("b");
<list>
<a>a</a>
<b>b</b>
<list>

list.add(userMap);
list.add(otherObject);
<list>
<user>
<name>test</name>
...
<user>
<otherObject>
....
</otherObject>
</list>

不过我想可能没有现成的工具可用,只能自己定个规则约束,可能不具备通用性~~
wizardblue 2006-03-28
  • 打赏
  • 举报
回复
自已写一个好了,应该不是很难的,
但不知道楼主意思是不是:
比如有
Map map=new HashMap();
map.put("username","test");
map.put("sex","1");
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
map.put("collection",list);
转换成xml
<User>
<username>test</username>
<sex>1</sex>
<collection>
1 2 3
</collection>
</User>
里边的1 2 3 要用什么样的格式?
lydvqq 2006-03-28
  • 打赏
  • 举报
回复
不知这样行不?如果你的MAP中的对象是特定的话,可以先转为XSteadm就很好了。这样解析的不太好。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.*;
import org.jdom.*;
import org.jdom.output.*;
import org.jdom.input.*;
public class XMLTest {
private static Document doc;
private static Element root;
XMLTest(){
root = new Element("OK");
doc= new Document(root);
}
void fromMap(Object o){
fromMap(o,root);
}

void fromMap(Object o,Element ele){
Element newEle = null;
if( o instanceof List ){
for(int i=0;i<((List)o).size();i++){
newEle = new Element("List");
ele.addContent(newEle);
fromMap(((List)o).get(i),newEle);
}
}else if( o instanceof Map ){
Map map = (Map)o;
Object[] obj = map.keySet().toArray();
newEle = new Element("User");
ele.addContent(newEle);
for(int i = 0;i<obj.length;i++){
Element sEle = new Element(obj[i].toString());
newEle.addContent(sEle);
fromMap(map.get(obj[i]),sEle) ;
}
}else{
ele.addContent(o.toString());
}
}

void createXML() throws Exception{
Format format = Format.getPrettyFormat();
format.setIndent(" ");
format.setEncoding("utf-8");
XMLOutputter outp = new XMLOutputter(format);
FileOutputStream fo = new FileOutputStream("text.xml");
outp.output(doc, fo);
fo.close();

}
public static void main(String[] args) throws Exception{
Map map = new HashMap();
map.put("age",new Integer(5));
map.put("userName","007");
List list = new ArrayList();
list.add("ssd");
list.add("kkk");
map.put("sss",list);

XMLTest xt = new XMLTest();
xt.fromMap(map);
xt.createXML();
}
}

  • 打赏
  • 举报
回复
通过调用XMLEncoder类的writeObject方法来实现,例如:
串行化一个JButton的例子:
import java.beans.XMLEncoder;
import java.beans.XMLDecoder;
import javax.swing.*;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


public class SerializeJButton{

public static void main(String args[])
{
new SerializeJButton();
}

public SerializeJButton(){

try {

System.out.println("Running");
FileOutputStream fos = new FileOutputStream("button.xml");
XMLEncoder xEnc = new XMLEncoder(fos);

xEnc.writeObject(new JButton("Click Me"));

fos.close();
}catch (Exception ex){
System.out.println(ex);
}
System.out.println("Ending");
System.exit(0);

}
}

串行化后的结果:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.3.0" class="java.beans.XMLDecoder">
<object class="javax.swing.JPanel">
<void method="add">
<object class="javax.swing.JButton">
<void property="bounds">
<object class="java.awt.Rectangle">
<int>82</int>
<int>47</int>
<int>111</int>
<int>34</int>
</object>
</void>
<void property="label">
<string>Click Me</string>
</void>
</object>
</void>
<void property="preferredSize">
<object class="java.awt.Dimension">
<int>200</int>
<int>200</int>
</object>
</void>
<void property="layout">
<null/>
</void>
</object>
</java>
wizardblue 2006-03-27
  • 打赏
  • 举报
回复
按照楼主的要求,光一个List 要如何输出?
加载更多回复(7)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧