xml的主要用途
- --数据存储和数据描述
- --是一个优良的配置文件
- --相当于一个小型数据库
- --xml不依赖于任何一种编程语言,是独立的w3c提供的规范,所以可以完成多种语言之间的数据交换(重点)
xml的语法严格,并且完全区分大小写
-
xml(
extensible markup language
)-描述事物本身 .xml
xsl (extensible stylesheet language
)-修饰xml xsl文件也有单独的文件,文件后缀 .xsl
通过以下陈程序引入xsl文件
1
|
<?xml-stylesheet type= "text/xsl" href= "student.xsl" ?>
|
dtd (docment type definition
)-约定xml的标签 在xml文件中只能编写那些标签,标签中只能编写那些属性 dtd有单独的文件,文件后缀 .dtd
dtd实例
schema-约定xml标签和类型,比dtd编写更加方便,(约束xml文件) schema有单独的文件,文件后缀 .xsd/.xml
实例是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?xml version= "1.0" encoding= "gb2312" ?>
<xs:schema xmlns:xs= "http://www.w3.org/2001/xmlschema" >
<xs:element name= "丛书" >
<xs:complextype>
<xs:sequence>
<xs:element name= "书" >
<xs:element name= "名" minoccurs= "1" ></xs:element>
<xs:element name= "人" ></xs:element>
<xs:element name= "价" >
<xs:attribute name= "unit" >
<xs:enumeration value= "rmb" />
<xs:enumeration value= "美元" />
<xs:enumeration value= "日元" />
</xs:attribute>
</xs:element>
</xs:element>
</xs:sequence>
</xs:complextype>
</xs:element>
</xs:schema>
|
可以扩展的原因:dtd可以修改
对比html
html(hyper text markup language
)
*超文本传输标记语句(程序员不能自己扩展)
*html主要用途:做页面展示,不会做数据处理
*语法松散,不区分大小写
css
dtd(doucment type defined
)约束html能有那些标签,标签能有那些属性
schema (dtd的升级版,语法更新一些,和dtd达到同等效果)
不可扩展原因:dtd不可扩展
关于xml文件的解析?
*无论是哪一种编程语言,对xml文件的解析都包括两种方式:
*dom解析
*sax解析(org.xml.sax.helps defaulthandler)
dom解析
*原理
在开始解析xml文件的时候,将整个xml文件全部加载到内存中
在内存中编程语言将xml文件映射成一颗dom树,这颗树就是一个
对象,然后我们对这棵树上的任意节点进行增删改查操作,由于
这棵树全部都在内存上,解析过去的节点可以再次解析,比较灵活。
*优点
灵活,解析过去的节点,可以再次解析
*缺点
如果xml文件比较大,可能会导致内存溢出,即使不导致内存溢出,
也会耗费大量内存,内存少了项目的运行效率自然就降低了。
*什么情况下选择dom解析方式
如果很灵活的操作每一个元素,选用dom解析,但是注意文件需要小一些
sax解析
*原理
sax解析是基于事件驱动型的解析方式,他的解析不需要将整个xml文件全部
转载到内存中,解析的时候是有顺序的,在xml文件中从上往下依次解析,遇
到开始标签,表示发生了一个特定的事件,此时执行一段特定的程序,遇到结束
标签表示又发生一个特定事件,此时执行一段特定的程序完成解析。
*优点
不需要转载xml文件,所以不会占用大量内存, 适合大文件
*缺点
解析过去的节点不能重复解析,除非重头开始
*什么情况下选择sax解析方式
大文件适合使用sax解析
作为程序员如何解析xml文件,解析xml文件的开源项目都包括那些?
java解析xml相关的开源项目
*dom4j(dom for java)
*jdom
.....
jdk自带一套,是实现w3c规范的
*org.w3c.com.*; 基于dom解析
*org.xml.sax.*; 基于sax解析
为了提高我们解析xml文件的效率,还涉及到xpath。(是一种标签匹配方式,类似于正则表达式,可以让我们程序快速定位xml文件中的标签)
解析xml文件涉及到:
dom4j/jdom/w3c+......xpath
jdk自带的一套解析
首先在src目录下创建一个xml文件
以下为解析过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/**
* 使用jdk自带的"dom解析"xml文件(读)
*/
public class text04 {
public static void main(string[] args) throws exception {
//创建文档解析器工厂对象
documentbuilderfactory factory= documentbuilderfactory.newinstance();
//创建文档解析器对象
documentbuilder builder=factory.newdocumentbuilder();
//开始解析xml文件
string path=thread.currentthread().getcontextclassloader().getresource( "db-config.xml" ).touri().getpath();
document document =builder.parse( new file(path)); //dom树,在内存中生成了一颗dom树
//获取根元素
node rootnode=document.getfirstchild();
//获取根元素的名字
system.out.println(rootnode.getnodename());
//通过根元素获取其他元素
node drivernode=document.getelementsbytagname( "driver" ).item( 0 );
string driver =drivernode.gettextcontent();
system.out.println(driver);
}
}
|
输出结果
使用dom4j开源项目(基于dom解析)解析xml文件(读)
需要将dom4j开源项目的jar包作为目录导入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/**
* 使用dom4j开源项目解析xml文件(读)
*
* 读xml文件
*
* dom4j
*
* 基于dom方式
*/
public class text01 {
public static void main(string[] args) throws exception {
//创建解析器对象
saxreader reader= new saxreader(); //虽然使用了saxreader,但是还是基于dom的解析方式
//获取文档对象,还是dom树
string path=thread.currentthread().getcontextclassloader().getresource( "db-config.xml" ).touri().getpath();
document document= reader.read( new file(path));
//获取根元素
element rootelement=document.getrootelement();
//system.out.println(element.getname());
//获取driver元素
element driverelement =rootelement.element( "driver" );
//在获取文本
string driver=driverelement.gettext();
//system.out.println(driver);
//直接获取元素的文本内容
driver=rootelement.elementtext( "driver" );
system.out.println(driver);
system.out.println(rootelement.elementtext( "url" ));
system.out.println(rootelement.elementtext( "user" ));
system.out.println(rootelement.elementtext( "password" ));
}
}
|
输出结果
使用dom4j开源项目(基于dom解析)解析xml文件(写)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import org.dom4j.document;
import org.dom4j.documenthelper;
import org.dom4j.element;
import org.dom4j.io.outputformat;
import org.dom4j.io.xmlwriter;
import java.io.file;
import java.io.filewriter;
/**
* 使用dom4j开源项目解析xml文件(写)
*/
public class text02 {
public static void main(string[] args) throws exception {
//创建文档对象
document document= documenthelper.createdocument();
//添加根元素
element studentinfoelt=document.addelement( "学生信息" );
//给学生信息节点添加子节点学生节点
element studentelt=studentinfoelt.addelement( "学生" );
//给学生节点添加id属性
studentelt.addattribute( "id" , "110" );
//给学生节点添加名字字节点
element nameelt=studentelt.addelement( "名字" );
//设置名字节点文本
nameelt.settext( "张三" );
//给学生节点添加性别字节点
element sexelt=studentelt.addelement( "性别" );
//设置名字节点文本
sexelt.settext( "男" );
//开始写
outputformat format= outputformat.createprettyprint();
format.setencoding( "utf-8" );
string path= "students.xml" ;
xmlwriter xmlwriter= new xmlwriter( new filewriter( new file(path)),format);
xmlwriter.write(document);
xmlwriter.close();
}
}
|
最终生成的xml文件
总结
本篇文章就到这里了,希望能给你带来帮助,也希望你能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/qq_45796208/article/details/109337321