XML+Dom4j解析
内容一 XML的定义
XML的全称为(EXtensible Markup Language),是一门可拓展的标记语言
- 标记语言:通过标签来描述数据的一门语言(标签有时我们称之为元素),类似于HTML语言
java中作用
- 用于储存和传输数据
- 软件的配置文件
优点:可读性好+可维护性比较高
了解:
万维网联盟(W3C)标准 HTML XML 制定web标准
例子:XML表示一个学生数据
<!--用XML代表学生-->
<!--用属性表示对标签的说明-->
<lzpstudent jwid="1">
<name>张三</name>
<age>18</age>
</lzpstudent>
<!--
注意:
1.标签由一对尖括号和合法标识符组成
2.标签必须成对出现
3.特殊的标签可以不成对,但是必须结束标记 比如:<jwimg/>
4.标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来,属性只会出现在开始标签中
5.标签需要正确的嵌套
-->
内容二:标准XML文件(要求)===》配置文件
虽然要求多但是每次都一样
-
XML文件的后缀名为:.xml
-
文档生命必须是第一行第一列
<?xml version="1.0" encoding="UTF-8" standalone="yes"
-
version:该属性是必须存在的
-
encoding:该属性不是必须的
- 打开当前xml文件的时候应该是使用什么字符编码表(一般取值是UTF-8)
-
standalone:该属性不是必须的,描述xml文件是否依赖其他的xml文件,取值为yes/no
-
必须存在一个根标签,有且只能有一个
-
XML文件中可以定义注释信息
-
XML文件中可以存在以下特殊字符
- <;< 小于
- >;> 大于
- &; & 和号
- &apos;’ 单引号
- "; “ 双引号
另外表示特殊字符方式
ML文件中可以存在CDATA区
<![CDATA[这里内容xml文件解析]]>
例子:
<?xml version="1.0" ecoding="UTF-8" ?>
<!--注释的内容-->
<!--本xml文件用来描述多个学生信息-->
<students>
<lzpstudent lzpId="1">
<name>张三</name>
<age>18</age>
<info><学生>其&它'特殊'"符号"</info>
<message>学生<![CDATA[我的内容体]]></message>
</lzpstudent>
<lzpstudent lzpId="2">
<![CDATA[内容]]>
<name>李四</name>
<age>20</age>
</lzpstudent>
</students>
内容三:xml解析
XML作为了配置文件(java读取这个内容)
XML解析就是从xml中获取到数据
解析的思想:—重点
DOM(Document Object Model)文档对象模型:就是把文档的各个组成部分看成对应的对象。
会把xml文件全部加载到内存,在内存中形成一个 树形结构,再获取对应的值。
常见xml解析工具很多:
- JAXP:SUN公司提供的一套XML解析的API
- JDOM:开源组织提供的一套XML的解析API-jdom
- DOM4j(本次使用的):开源组织提供的一套xml的解析的API-dom4j,全称:Dom For Java
- pull:主要应用再Android手机端解析xml
实现解析----》java导入包外部包
- 我们可以通过网站:https://dom4j.github.io/ 去下载dom4j
- 将下载好的dom4j-1.6.1zip解压,找到里面的dom4j-1.6.1.jar
- 在IDEA中当前模块下新建一个libs文件夹,将jar包复制到文件夹中
- 选中jar包–右键–选择add as library/添加为库 即可
例子:java读取xml中内容
- 解析提供好的xml文件(学生的配置信息)
- 将解析到的数据封装到学生对象中
- 并将学生对象储存到ArrayList集合中
- 遍历集合
准备的xml文件:
<?xml version="1.0" ecoding="UTF-8" ?>
<!--注释的内容-->
<!--本XML文件用来描述多个学生信息-->
<students>
<!--第一个学生信息-->
<student id="1">
<name>张三</name>
<age>23</age>
</student>
<!--第二个学生信息-->
<student id="2">
<name>李四</name>
<age>24</age>
</student>
</students>
学生类 -->设计思路(学号 姓名 年龄)
//上边是已经准备好的student.xml文件
public class Student
{
private String id;
private String name;
private int age;
public Student(){}
public Student(String id,String name,int age)
{
this.id=id;
this.name=name;
this.age=age;
}
//set和get方法
public void setId(String id){this.id=id;}
public void setName(String name){this.name=name;}
public void setAge(int age){this.age=age;}
public String getId(){return id;}
public String getName(){return name;}
public int getAge(){return age;}
//重写toString方法
@Override
public String toString()
{
return "student{"+"id='"+id+'\''+ ",name='"+name+'\''+",age='"+age+'\''+'}'
}
}
解析的API思路(固定的)
-
获取一个解析器对象
SAXReader saxReader = new SAXReader();
-
利用解析器把xml文件加载(read())到内存中,返回一个文档对象
-
获取根标签getRootElement();
-
elements():可以获取调用者所有的字标签,会把这些字标签放到一个集合中返回
-
elements(“标签名”):可以获取调用者所有的制定的子标签,会把这些标签放到一个集合中并返回
-
element.element(“标签的名字”) 获取指定的标签内容
-
element.attribute(“属性的名字”) 获取指定的属性内容
-
element.getText() 获取标签的内容
举个栗子:
import org.dom4j.Attribute; // 获取Attribute属性值
import org.dom4j.Document; // 处理xml文件 如读取
import org.dom4j.DocumentException; // 文档异常处理
import org.dom4j.Element; // 获取元素
import org.dom4j.io.SAXReader; // 解析xml数据
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class jwXmlparse
{
public static void main(String[] orgs) throws DocumentException
{
//1.获取一个解析器对象
SAXReader saxReader = new SAXReader();
//2.利用解析器把xml文件加载(read())到内存中,并返回一个文档对象
Document jwdocument = saxReader.read(new File("jwstudent.xml"));
//3.获取根标签getRootElement();
Element jwrootElement = jwdocument.getRootElement();
//4.elements():可以获取调用者所有的子标签,会把这些子标签放到一个集合中返回
//5.elements("标签名"):可以获取调用者所有的指定的子标签,会把这些子标签放到一个集合中并返回
List<Element> jwstus = jwrootElement.element("student");
System.out.println(jwstus.size());//查看学生数量
//6.创建集合,存放内容
ArrayList<student> jwlist = new ArrayList<>();
//遍历所有的学生
for(Element jwelement:jwstus)
{
//得到了每一个学生标签
//先获取便签id的属性值
//7.element.attribute(“属性的名字”) 获取指定的属性内容
Attribute attribute = jwelement.attribute("id");//获取属性的名字和值
//获取属性的值getValue();
String id = attribute.getValue();
//再获取学生的name标签值
//获取标签下的(student标签下的name标签) API element(标签的名字)
Element nameElement = jwelement.element("name");
//获取这个标签的标签体内容getText();
String name = nameElement.getText();
//获取age标签的内容
//获取标签下的标签(student标签下的name标签) API element(标签的名字)
Element ageElement = jwelement.element("age");
//getText()获取这个标签的标签体内容
String age = ageElement.getText();
//将获取到的数据封装到集合中去
student s = new student(id,name,Intteger.parseInt(age));
jwlist.add(s);
}
}
}
注:其他的都是大同小异 套用此模板进行解析