IMUT-LF

XML-学习笔记

XML

1.1 xml简介

a)xml 是可扩展标识语言(Extensible Markup Language),就是开发者在符合xml命名规则的基础之上,可以根据自己的需求定义自己的标签

是一种标记语言

b)xml 是一种非常灵活的语言,没有固定的标签,所有的标签都可以自定义

c)通常,xml 被用于信息的记录和传递。因此,xml 经常被用于充当配置文件

 

xml 编辑器:

记事本、DW、XMLSpy、eclipse等

 

1.2 格式良好的 xml

格式良好的XML文档:遵循XML文档的基本规则

a)声明信息,用于描述 xml 的版本和编码方式

<?xml version="1.0" encoding="UTF-8"?>

b)xml 有且仅有一个根元素

元素由开始标签、元素内容和结束标签组成

c)xml 标签大小写敏感

d)属性值用双引号

e)标签成对

f)元素正确嵌套

xml注释:<!-- -->

 

有效的XML文档

首先必须是格式良好的

使用DTD和XSD(XML Schema)定义语义约束

 

DTD

2.1、DTD简介

a.DTD(Document Type Definition:文档类型定义)

b.DTD用于约束XML的文档格式,保证xml是一个有效的xml

c.DTD可以分为两种:内部DTD(DTD代码写在xml文件内)、外部(DTD代码相对xml文件独立,使用时引入)

 

2.2、使用DTD

①内部DTD的定义

语法:<!DOCTYPE 根元素 [元素声明]>

元素声明语法:<!ELEMENT 元素名 (子元素 , ...)>

若指定标签内只允许写值,不允许嵌套标签,则可以加上<!ELEMENT 元素名 (#PCDATA)>

属性声明语法:<!ATTLIST 元素名称 属性名称 属性类型 默认值>

属性类型常用CDATA(character data,值为字符数据)

常用的默认值:#REQUIRED(属性值是必需的)、#IMPLIED(属性不是必需的)

数量词:

+:表示出现1次或多次(至少一次)

?:表示出现0次或1次

*:表示出现任意次

DTD示例:
<!-- 声明内部DTD -->
<!DOCTYPE scores [ //声明根元素为scores
<!ELEMENT scores (student*)> //声明根元素scores可以包含任意个student元素
<!ATTLIST student id CDATA #REQUIRED> //声明student元素必须包含id属性
<!ELEMENT student (name, course, score)> //声明student元素包含name,course,score元素
<!ELEMENT name (#PCDATA)> //声明name元素开始与结束符间需为可解析的字符串
<!ELEMENT course (#PCDATA)> //声明course元素开始与结束符间需为可解析的字符串
<!ELEMENT score (#PCDATA)> //声明score元素开始与结束符间需为可解析的字符串
]>
编写完DTD代码后,编写xml文件时按Alt+/会有提示

 

②外部DTD的定义

a.创建一个独立的 dtd 文件

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT scores (student*)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT student (name, course, score)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>

b.在.xml文件中引入 .dtd 文件

语法:<!DOCTYPE 根元素 SYSTEM "文件名">

如:
<!-- 引入外部dtd文件 -->
<!DOCTYPE scores SYSTEM "scores.dtd">

 

注:注意各语法之中的空格

 

 

XML的解析

xml的解析:对xml文件进行操作,包括创建xml、对xml文件进行增删改查等操作

3.1、常见的 xml 解析技术

3.1.1、DOM解析

官方(sun公司)提供的解析方式,基于XML树结构,比较耗资源,适用于多次访问xml

3.1.2、SAX解析

基于事件解析,消耗资源少,适用于数据量较大的xml

3.1.3、JDOM解析

开放源代码,比DOM更快,JDOM仅使用具体类而不使用接口

3.1.4、DOM4J

第三方提供,是JDOM的升级版,开放源代码,非常优秀的Java XML API,性能优异,功能强大,使用接口而不是实现类

 

3.2、DOM4J解析XML

解析 xml 的入口:需要先拿到一个 Document 对象

3.2.1、读取 xml 文件中的信息

示例代码:

public static void main(String[] args) throws DocumentException {
   //1.创建SAXReader对象,用于读取xml文件
   SAXReader reader = new SAXReader();
   //2.读取xml文件,得到Document对象(该对象代表整个xml文件)
   Document doc = reader.read(new File("src/scores2.xml"));
   //3.获取根元素
   Element root = doc.getRootElement();
   //4.获取根元素下所有子元素(迭代器)
   Iterator<?> it = root.elementIterator();
   while(it.hasNext()) {
       //取出元素,强转成Element类型
       Element e = (Element) it.next();
       System.out.println(e.getName());
       //获取id属性
       Attribute id = e.attribute("id");
       System.out.println(id.getName()+"="+id.getValue());
       //获取student的子元素
       Element name = e.element("name");
       Element course = e.element("course");
       Element score = e.element("score");
       //打印
       System.out.print(name.getName()+"="+name.getStringValue());
       System.out.print(" "+course.getName()+"="+course.getText());
       System.out.println(" "+score.getName()+"="+score.getText());
       System.out.println("--------------------");
  }

}

3.2.2、向xml文件中写入信息

示例代码:

public static void main(String[] args) throws IOException {
   //1.通过DocumentHelper生成一个Document对象
   Document doc = DocumentHelper.createDocument();
   //2.添加并得到根元素
   Element root = doc.addElement("books");
   //3.为根元素添加子元素
   Element book = root.addElement("book");
   //4.为book元素添加属性
   book.addAttribute("id", "b01");
   /*以上可写成链式编程:doc.addElement("books").addElement("book").addAttribute("id","b01");*/
   //5.为book元素添加子元素
   Element name = book.addElement("name");
   Element author = book.addElement("author");
   Element price = book.addElement("price");
   //6.为子元素添加文本信息
   name.addText("Thinking in Java");
   author.addText("liufeng");
   price.addText("88.8");
   /*
//7.将doc输出到xml文件中
Writer writer = new FileWriter(new File("src/book2.xml"));
doc.write(writer);
//8.关闭资源
writer.close();
*/

   //7.格式良好的输出
   OutputFormat format = OutputFormat.createPrettyPrint();
   XMLWriter writer = new XMLWriter(new FileWriter(new File("src/book2.xml")), format);
   writer.write(doc);
   //8.关闭资源
   writer.close();
}

 

posted @ 2021-01-15 21:54  IMUT_LF  阅读(157)  评论(0)    收藏  举报

IMUT-LF