在这里,简单的介绍一下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;
}