xml解析
1. 概念
可扩展标记语言,xml是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的
限制,可以说它是一个拥有互联网最高级别通行证的数据携带者。xml是当前处理结构化文档信息中相当给力的技
术,xml有助于在服务器之间穿梭结构化数据,这使得开发人员更加得心应手的控制数据的存储和传输。
Xml用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的
标记语言进行定义的源语言。Xml是标准通用标记语言(SGML)的子集,非常适合Web传输。XML提供统一的方
法来描述和交换独立于应用程序或供应商的结构化数据。
2. 特点与作用
2.1. 特点
xml与操作系统、编程语言的开发平台都无关;
现不同系统之间的数据交互。
2. 2作用
3. 配置应用程序(servlet 配置,框架环境配置等)和网站
4. 数据交互;
5. Ajax基石
3. 基础语法
格式良好的 XML 文档需满足以下条件:
必须有XML声明语句
必须有且仅有一个根元素
标签大小写敏感
属性值用双引号
标签成对
元素正确嵌套
注:
1.xml声明一般是xml文档的第一行;
2. xml中,一些字符拥有特殊的意义。如果把字符“<”放在xml元素中,会发生错误,这是因为解析器会把它当作新元素的开始,这样会产生xml错误
if salary <100 then
为了避免这个错误,请用实体引用来代替“<”字符:
if salary < 100 then
xml中5个预定义实体
例如
使用XML描述下表中的学生成绩信息。XML文件为scores.xml
> <?xml version="1.0" encoding="utf-8" ?> <scores>
<student>
<ID>1</ID>
<姓名>王同</姓名>
<课程>java</课程>
<成绩>89</成绩>
</student>
<student>
<ID>2</ID>
<姓名>李佳</姓名>
<课程>sql</课程>
<成绩>58</成绩>
</student>
</scores>
4. DTD技术
DTD即文档类型定义–Document Type Definition
• 使每个XML文件可以携带一个自身格式的描述
• 一个DTD文档可能包含如下内容:
1.元素的定义规则
2.元素之间的关系规则
3.属性的定义规则
示例
使用DTD验证描述诗集的XML文档
> <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE poem [
<!ELEMENT poem (author,title,content) >
<!ELEMENT author (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>
]>
<poem>
<author>王维</author>
<title>鹿柴</title>
<content>空山不见人,但闻人语声。返景入深林,复照青苔上。
</content>
</poem>
5. 引入DTD的方式(了解)
当验证的XML文件较多时,使用内部DTD可能出现冗余,此时可以通过引入dtd 文件进行xml 约束。
方式1
> <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE poem [
<!ELEMENT poem (author,title,content) >
<!ELEMENT author (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>
]>
<poem>
<author>王维</author>
<title>鹿柴</title>
<content>空山不见人,但闻人语声。返景入深林,复照青苔上。
</content>
</poem>
方式2
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
6. Schema 技术(了解)
Shema规定xml文档实例的结构和每个元素/属性的数据类型。
理解:对于Schema来讲,我们可以将shema比喻成为是表结构。在表结构里,定义一些数据的限制要求。然后我们xml文档就相当于是数据表将来要存储的数据,也就是数据库里面的数据表数据了,所以整体来讲的话schema它就是用于验证xml文档的。
> <?xml version="1.0" encoding="utf-8" ?> <xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.myschema.com.cn"
xmlns="http://www.myschema.com.cn" elementFormDefault="qualified">
<xs:element name="person"> <xs:complexType> <xs:sequence>
<xs:element name="id" type="xs:integer"/> <xs:element name="name"
type="xs:string"/> <xs:element name="sex" type="xs:string"/>
<xs:element name="address" type="xs:string"/> </xs:sequence>
</xs:complexType> </xs:element> </xs:schema>
> <?xml version="1.0" encoding="utf-8" ?> <person
xmlns="http://www.myschema.com.cn">
<id>1</id>
> <?xml version="1.0" encoding="utf-8" ?> <person
xmlns="http://www.myschema.com.cn">
<id>1</id>
7. xml解析
xml解析即将文件中的内容按照指定 的含义进行获取
7.1. Dom4J解析Xml(推荐)
DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连Sun 的 JAXM 也在用 DOM4J。
Api文档参考地址: https://dom4j.github.io/
7.2. DOM4J 解析学生成绩信息 scores.xml
scores.xml
<?xml version="1.0" encoding="utf-8" ?>
<students>
<Student>
<Name>张三</Name>
<Num>2018001</Num>
<Classes>0113</Classes>
<Address>上海外国语</Address>
<Tel>123456</Tel>
</Student>
<Student>
<Name>王五</Name>
<Num>2018002</Num>
<Classes>0114</Classes>
<Address>上海外国语</Address>
<Tel>657432</Tel>
</Student>
</students>
获得document 对象
> SAXReader reader=new SAXReader();
> Document document=reader.read(new File(“input.xml”));
操作xml文档节点
> Element rootElm=document.getRootElement();//获得根节点
Element memberElm=root.element("member"); //获得子节点
String text=memberElm.getText();//获得节点文本
Element ageElm=newMemberElm.addElement("age");//添加子节点
ageElm.setText("29");//设置节点文本
parentElm.remove(childElm);//)删除某节点
例子
> public static void main(String[] args) throws Exception{
SAXReader reader=new SAXReader();
Document document=reader.read(new File("src\\source.xml"));
Element rootElm=document.getRootElement();//获得根节点
Element memberElm=rootElm.element("Student"); //获得子节点
Element ageElm=memberElm.addElement("age");//添加子节点
ageElm.setText("29");//设置节点文本
// 创建格式化类
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码格式,默认UTF-8
format.setEncoding("UTF-8");
//创建输出流,此处要使用Writer,需要指定输入编码格式,使用OutputStream则不用
FileOutputStream fos = new FileOutputStream("src\\source.xml");
// 创建xml输出流
XMLWriter writer = new XMLWriter(fos, format);
writer.write(document);
writer.close();
}