XML-学习笔记
1.1 xml简介
a)xml 是可扩展标识语言(Extensible Markup Language),就是开发者在符合xml命名规则的基础之上,可以根据自己的需求定义自己的标签
是一种标记语言
b)xml 是一种非常灵活的语言,没有固定的标签,所有的标签都可以自定义
xml 编辑器:
记事本、DW、XMLSpy、eclipse等
1.2 格式良好的 xml
格式良好的XML文档:遵循XML文档的基本规则
a)声明信息,用于描述 xml 的版本和编码方式
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 -->
②外部DTD的定义
a.创建一个独立的 dtd 文件
b.在.xml文件中引入 .dtd 文件
语法:<!DOCTYPE 根元素 SYSTEM "文件名">
如:
<!-- 引入外部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();
}

浙公网安备 33010602011771号