`

如何生成一个XML文档

阅读更多

在这里,简单的介绍一下XML,以及如何来生成一个XML文档和怎样解析一个XML文档。

 

1.什么是XML

    • xml指可扩展标记语言(EXtensible Markup Language)
    • xml是以一种标记语言,很类似HTML
    • xml的设计宗旨是传输数据,而不是显示数据
    • xml标签没有被预定义,需要自行定义标签
    • xml被设计为具有自我描述性
    • xml是W3C的推荐标准

2.XML与HTML的差异

  • xml不是html的替代
  • xml和html为不同的目的而设计
  • xml被设计为传输和存储数据,其焦点是数据的内容
  • html被设计用来显示数据,其焦点是数据的外观
  • html旨在显示信息,而xml旨在传输信息

XML可以跨语言传输数据

 

3.一个规范的XML文档

 

<?xml version="1.0" encoding="UTF-8" ?> 
<班级>
    <学生 id="001">
        <姓名>张三</姓名>
        <成绩>
            <Math>90</Math>
            <English>80</English>
        </成绩>
    </学生>   
    <!-- 下面是第二个学生的描述 -->
    <学生 id="002">
        <姓名>Tom</姓名>
        <成绩>
            <Math>95</Math>
            <English>78</English>
        </成绩>
    </学生>
</班级>

①.XML文档的格式

  • 第一行是xml文档的头文件,每个xml文档都有这样一个头文件
  • encoding值是xml的编码格式
  • <班级> 为根元素,其他所有元素都必须包含在根元素内部
  • <学生>为班级的子元素,‘学号’为学生的属性
  • :是xml文档中的注释,与html相同
  • 标签必须成对出现

②.XML文档的语法规则

一个好的语言都是有语法规则的,这样,他才能很好的普及。XML语法具有以下的几条规则:

  • 所有xml元素都必须有关闭标签
  • xml标签对大小写敏感
  • xml必须正确地嵌套
  • xml必须有根元素
  • xml的属性值必须加引号
  • 元素名称不能以数字和"_"(下划线)开头、不能以xml开头、不能包含空格与冒号
  • html中的转义字符在xml中也可以使用,如果文本中需要转义的字符太多,还可以使用"<![CDATA[需要转义的文本]]>"

4.生成XML文档

 

XML作为数据的传输语言,它能够很好的显示数据信息,那么怎样把一张表或者一个实例对象转换为xml呢?

以User对象为例,使用JAXB生成User对象的xml:

 

首先,你得有一个User对象:

package com.cn.entity;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement    //注解,要想生成xml必须得加哦~ ~  切记 不要导错了包!!~~
public class User {
	private String name;
	private int id;
	private String password;
	private String email;
	private List<Message> messageList; 
        //set和get方法
        ... ...
}

-------------------------------------------------

package com.cn.entity;
public class Message {
	private int id;
	private String content;    //message的内容
        //set和get方法
        ... ...

}

 

然后,调用JAXB的一些方法生成xml,在此之前,别忘了导入JAXB的一些jar包:

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import com.cn.entity.Message;
import com.cn.entity.User;

public class Test {
	public static void main(String[] args) throws Exception {
	
		User user = new User();
		user.setName("tom");
		user.setPassword("123");
		
		Message m1 = new Message();
		m1.setId(1);
		m1.setContent("tom生成了xml");
		
		Message m2 = new Message();
		m2.setId(2);
		m2.setContent("jack解析了xml");
		
		List<Message> list = new ArrayList<Message>();
		list.add(m1);
		list.add(m2);
		
		user.setMessageList(list);
		
		JAXBContext ctx = JAXBContext.newInstance(User.class);
		Marshaller marshaller = ctx.createMarshaller();
		marshaller.setProperty(Marshaller.JAXB_ENCODING,"GBK");	//设置xml的编码
		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);	//让生成的xml按规范的格式显示
		marshaller.marshal(user, System.out);	//让xml输出在控制台
}

 让我们来看看结果吧:

<?xml version="1.0" encoding="GBK" standalone="yes"?>
<user>
    <id>0</id>
    <messageList>
        <content>tom生成了xml</content>
        <id>1</id>
    </messageList>
    <messageList>
        <content>jack解析了xml</content>
        <id>2</id>
    </messageList>
    <name>tom</name>
    <password>123</password>
</user>

 

是不是总感觉哪里不对劲,如果把id作为属性会不会感觉好点~~~

 

其实,这个也很简单,就是写几行注解的事:

    • 把id作为其父节点的属性值,在属性的set方法上添加注解: @XmlAttribute
    • 给两个messageList添加一个父节点,在messageList的set方法上添加:@XmlElementWrapper(name="Messages") name 的值是给该父节点起了名称叫“Messages”
    • 忽略属性,就是在属性的set方法上添加:@XmlTransient ,在生成的xml文档中就不会显示该属性
    • 修改标签的名称,在其对应的属性的set方法上添加:@XmlElement(name="修改的标签名称"),name的值就是标签修改后的名称
@XmlAttribute        //将id其父标签的属性
	public void setId(int id) {
		this.id = id;
	}
    ... ...
    @XmlElement(name="msg")        //将默认的“content”标签改为“msg”
	public void setContent(String content) {
		this.content = content;
	}
    ... ...
    @XmlElementWrapper(name="Messages")        //给messageList添加父标签,并且命名为“Messages”
	public void setMessageList(List<Message> messageList) {
		this.messageList = messageList;
	}

 

分享到:
评论
1 楼 lylan 2014-10-16  

相关推荐

Global site tag (gtag.js) - Google Analytics