1.简介
eXtensible Markup Language,可扩展标记型语言
- 使用标签进行操作
- 自定义标签
- 主要的功能是存储数据
- 一般使用的是1.0版本
2.应用
- 用于传输数据
- 用于系统的配置文件
3.语法
<?xml version="1.0" encoding="UTF-8"?>
<myGroup>
<!--注释 -->
<member>
<id>1</id>
<name>Tom</name>
<age>22</age>
<Hobby>music</Hobby>
<location>top</location>
</member>
<!--把CDATA区里面的内容当做普通文本内容,而不是标签来进行处理-->
<![CDATA[ 内容 ]]>
</myGroup>
4.解析
1.解析的分类
- dom解析:根据xml的层级结构在内存中分配一个树形结构
- 优点:因为分配了一个树形结构,很方便的实现增加、修改、删除的操作
- 缺点:如果要解析的文件过大,一次性在内存中分配一个树形结构,造成内存的溢出
- sax解析:边读边解析,读到特定的标签时候,自动调用相应的方法进行操作
- 优点:不会造成内存的溢出
- 缺点:不能实现增加 修改 删除的操作
- pull解析:原理和sax解析一样
5.示例代码
//解析
class XMLPull{
//封装获取解析器方法
private static XmlPullParser getParser(String path) throws Exception{
// 工厂对象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 创建解析器对象
XmlPullParser parser = factory.newPullParser();
// 设置输入流
parser.setInput(new FileInputStream(path),"UTF-8");
return parser;
}
//SAX读取xml文档资源数据
public static void parseXml() throws Exception {
//创建解析器:该解析器会一直处于活动状态
XmlPullParser parser = getParser("xml/persons.xml");
//开始解析
int type = 0;
List<Person> personList = null;
Person person = null;
//parser解析器获取当前解析的元素类型,如果不是文档结束,说明需要继续解析
while((type=parser.getEventType()) != XmlPullParser.END_DOCUMENT){
String tagName = parser.getName();
if(type==XmlPullParser.START_TAG){//开始标签类型
if("persons".equals(tagName)){
personList = new ArrayList<Person>();
}else if("person".equals(tagName)){
person = new Person();
String gender = parser.getAttributeValue(0);
person.setGender(gender);
}else if("username".equals(tagName)){
String username = parser.nextText();
person.setUsername(username);
}else if("age".equals(tagName)){
int age = Integer.parseInt(parser.nextText());
person.setAge(age);
}
}else if(type==XmlPullParser.END_TAG){//结束标签类型
if("person".equals(tagName)){
personList.add(person);
}
}
parser.next();
}
}
}
//序列化
class SerializeXml{
// 获取Person List
private static List<Person> getPersonList() {
List<Person> personList = new ArrayList<Person>();
personList.add(new Person("zhangsan",23,"man"));
personList.add(new Person("lisi",24,"woman"));
personList.add(new Person("wangwu",25,"man"));
return personList;
}
public static void serializeXml() throws Exception {
//获取多个对象:需要遍历 创建多个person标签
List<Person> personList = getPersonList();
//一个对象
Person person1 = new Person("zhangsan",23,"man");
// 工厂对象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlSerializer serializer = factory.newSerializer();
serializer.setOutput(new FileOutputStream("xml/out.xml"), "UTF-8");
//设置格式,换行缩进
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
//---开始序列化---
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "persons");
for(Person person : personList){
serializer.startTag(null, "person");
//标签属性:必须跟在person后面,不能放到设置子标签后面设置
serializer.attribute(null, "age", person.getAge()+"");
//子标签
serializer.startTag(null, "username");
serializer.text(person.getUsername());
serializer.endTag(null, "username");
//自闭合标签
serializer.startTag(null, "gender");
serializer.attribute(null, "type", person.getGender());
serializer.endTag(null, "gender");
serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
}
}