好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java解析XML详解

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://HdhCmsTestw3.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测试数据.*; 基于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

查看更多关于java解析XML详解的详细内容...

  阅读:20次