XML学习记录

1. 认识XML

1.1. 什么是XML

XML:可扩展标记语言(Extensible Markup Language)
使用简单的标记来描述数据。
XML是一种非常灵活的语言,没有固定的标签,所有标签都可以自定义。
通常,XML被用于信息的记录和传递。因此,XML通常被用来充当配置文件。

1.2. XML的格式

1、声明信息,用于描述XML的版本和编码方式。
<?xml version="1.0" encoding="UTF-8"?>
2、XML有且只有一个根元素。
3、XML是大小写敏感的。
4、标签是成对出现的,并且要正确嵌套。
5、属性值要用双引号包含起来。
6、注释要用<!-- -->包含起来。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book id="book01">
		<name>java初级编程</name>
		<author>张三</author>
		<price>20</price>
	</book>
	<book id="book02">
		<name>java中级编程</name>
		<author>李四</author>
		<price>30</price>
	</book>
</books>

2. 认识DTD

2.1. 什么是DTD

DTD:文档类型定义(Document Type Definition)
DTD用来约束XML的文档格式,保证XML是一个有效的XML。
DTD可以分为两种:内部DTD、外部DTD。

2.2. 使用DTD

2.2.1. 内部DTD

  1. 内部DTD的定义

    假如DTD被包含在XML源文件中,他应该通过下面的语法包装在一个DOCTYPE的声明中。
    

    声明如下:

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

    <!ELEMENT 元素名 (子元素[,子元素...])>
    
  3. 数量词

    “+”:表示出现一次或多次。
    “?”:出现0次或一次
    “*”:表示出现任意次

  4. 属性声明语法

    <!ATTLIST 元素名称 属性名称 属性类型 属性值>
    

    属性类型:CDATA,表示字符数据(character data)
    默认值:#REQUIRED,表示必须出现;#IMPLIED,表示不是必须的。
    示例:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 声明内部DTD -->
<!DOCTYPE scores [
	<!ELEMENT scores (student+)>
	<!ELEMENT student(name,course,score)>
	<!ATTLIST student id CDATA #REQUIRED>
	<!ELEMENT name (PCDATA)>
	<!ELEMENT course (PCDATA)>
	<!ELEMENT score (PCDATA)>
]>
<scores>
	<student id="1">
		<name>张三</name>
		<course>Java</course>
		<score>90</score>
	</student>
	
	<student id="2">
		<name>李四</name>
		<course>C语言</course>
		<score>80</score>
	</student>
</scores>

2.2.2. 外部DTD

  1. 创建一个独立的DTD文件
<!-- scores.dtd文件 -->
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT scores (student+)>
<!ELEMENT student(name,course,score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (PCDATA)>
<!ELEMENT course (PCDATA)>
<!ELEMENT score (PCDATA)>
  1. 在XML中引入外部DTD文件
    格式:<!ENTITY 实体名称 SYSTEM "URI/URL">
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入外部DTD -->
<!ENTITY scores SYSTEM "scores.dtd">
<scores>
	<student id="1">
		<name>张三</name>
		<course>Java</course>
		<score>90</score>
	</student>
	
	<student id="2">
		<name>李四</name>
		<course>C语言</course>
		<score>80</score>
	</student>
</scores>

3. 认识XSD

3.1. 什么是XSD

XSD:XML Schema是DTD的替代者。
不仅可以定义XML文档的结构,还可以规范文档的内容。
XSD本身也是XML文档。

XSD采用XML来定义语法约束,比DTD要复杂一些,但是功能强大的多。

  1. 支持丰富的数据类型
  2. 允许开发者自定义数据类型
  3. 可读性强
  4. 可针对未来需求进行扩展

4. XML的解析

4.1. 常见的XML的解析技术

  1. DOM解析
    是官方提供的解析方式,基于xml树解析,比较耗资源,适用于多次访问XML。
  2. SAX解析
    是民间解析方式,基于事件解析,消耗资源小,适用于数据量较大的XML。
  3. JDOM解析
    第三方提供,开源免费的解析方式,比DOM快。JDOM仅使用具体类而不使用接口。
  4. DOM4J解析
    第三方提供,开源免费,非常优秀的java XML API,性能优异,功能强大,使用接口而不使用实现类。是JDOM的升级版。

4.2. DOM4J解析XML

解析XML的入口是需要先拿到一个Document对象

步骤:
首先导包

  1. 创建SAXReader对象,用于读取XML
    SAXReader saxReader = new SAXReader();
    
  2. 读取XML文件,得到document对象,这个documen对象就代表XML文件
    Document document = saxReader.read(new File("fileName"));
    
  3. 获取根元素
    Element rootElement = document.getRootElement();
    
  4. 获取根元素下的所有子元素
    可以通过元素迭代器迭代,遍历子元素
    Iterator<Element> elementIterator = rootElement.elementIterator();
    while(elementIterator.hasNext()){
    	//取出根元素下的子元素
    	Element book = elementIterator.next();
    	//获取ID属性(若有多个属性,可以使用属性迭代器attributeIterator)
    	Attribute id = element.attribute("id");
    	// 获取student的子元素
    	Element name = book.element("name");
    	Element author = book.element("author");
    	Element price = book.element("author");
    }
    
    可以先获得某个元素的所有子元素
    // 得到某元素下的所有子元素,生成一个集合
    List<Element> element = rootElement.elements();
    for(Element ele : element){
    	// 获取当前节点下名为name子元素的文本值
    	String name = ele.elementText("name");
    	String author = ele.elementText("author");
    	String price = ele.elementText("price");
    }
    

4.3. 生成XML

  1. 通过DocumentHelper生成一个Document对象
    Document document = DocumentHelper.createDocument();
    
  2. 添加并得到根元素
    // 不但创建了根元素,还得到了一个books根元素
    Element books = document.addElement("books");
    
  3. 为根元素添加子元素,还可以得到子元素
    // 不但创建了一个book元素,还得到了一个book元素
    Element book = books.addElement("book");
    
  4. 为book元素添加属性,还可以得到一个元素
    book.addAttribute("id","01");
    // 截止到此处,可以将上边四句合为一句
    DocumentHelper.createDocument.addElement("books").addElement("book").addAttribute("id","01");
    
  5. 为book添加子元素
    Element name = book.addElement("name");
    Element author = book.addElement("author");
    Element price = book.addElement("price");
    
  6. 为子元素添加文本信息
    name.addText("Java基础教程");
    author.addText("张三");
    price.addText("20");
    
  7. 将document输出到XML文件中即可 (输出无格式)
    Writer writer = new FileWriter(new File("src/book.xml"));
    document.write(writer);
    
    将document输出到XML文件中即可 (格式良好)
    OutputFormat format = OutputFormat.createPrettyPrint();
    XMLWriter xmlWriter = new XMLWriter(new FileWriter(new File("src/book.xml")) , format);
    writer.write(document);
    
  8. 关闭资源
    writer.close();
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值