XML基础学习

XML基础学习

@author:HB、ocean

@time:2020-3-20

1.XML简介

  • xml,eXtensible Markup Language,可扩展标记语言+

  • 灵活 可自定义标签

  • 用于消息记录和传递,充当配置文件(存储数据 数据交换 配置文件)

格式

  • 声明信息,描述版本和编码方式
<?xml version="1.0" encoding="UTF-8"?>
  • xml有且只有一个根元素
  • 大小写敏感
  • 标签成对出现,正确嵌套
  • 属性值使用双引号
  • 注释写法
<!-- 这是注释 -->
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这是注释 -->
<books>
	<book id="b01">
		<name>Java语言</name>
		<author>田一百五十六</author>
		<price>156</price>
	</book>
	<book id="b02">
		<name>田语言</name>
		<author>李四</author>
		<price>4</price>
	</book>
</books>
  • 有效的xml文档

    • 格式良好
    • 使用DTD和XSD(XML Schema)定义语义约束

2.DTD

  • DTD,Document Type Defination 文档类型定义

  • DTD用于约束xml文档格式。保证xml是一个有效的xml

  • 使用DTD生成模板,快速书写

  • DTD分为两种,内部DTD,外部DTD

内部DTD

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

  • 数量词

    • +:表示出现1次或多次 至少一次
    • ?:表示出现0次或1次
    • *:表示出现任意次
  • 属性声明语法

    • 属性类型:CDATA(字符数据类型 character data)(只有CDATA不被解析)

    • 默认值:

      • #REQUIRED,表示必须出现

      • #IMPLIED,表示不是必须的

  • PCDATA 指的是被解析的字符数据(Parsed Character Data)(不能含有元素)。

  • 完整xml

    <?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>156</score>
    	</student>
    	<student id="2">
    		<name>李四</name>
    		<course>田语言</course>
    		<score>58</score>
    	</student>
    </scores>
    

外部DTD

+ 创建一个独立的DTD文件(与内部DTD语法一样 (除!DOCTYPE 根元素声明不加入)  )

  ```xml
  <?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)>
  ```

+ 在xml引入外部DTD文件

  ```xml
  <!-- 引入外部DTD文件 -->
  <!DOCTYPE scores SYSTEM "scores.dtd">
  ```

约束和验证XSD

  • DTD升级版 可以规范文档内容

3.XML解析

  • 对xml文件操作,创建、增删改查

常见xml解析技术

  1. DOM解析

    官方提供解析方式 基于xml树 消耗资源大

  2. SAX解析

    民间解析方式,基于事件的解析 消耗资源小

  3. JDOM解析

    第三方提供、开源、免费、比DOM解析快(使用实现类)

  4. DOM4J -->DOM for JAVA

    第三放提供、开源、免费、JDOM升级版 (使用接口)

DOM4J解析xml

解析xml文件入口,拿到一个Document对象

  1. 读取xml中文件的信息

    package com.hb.dom4j;
    
    import java.io.File;
    import java.util.Iterator;
    
    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    public class TestXML {
    
    	public static void main(String[] args) throws Exception {
    		// TODO Auto-generated method stub
    		// [1]创建SAXReader对象,用于读取xml文件
    		SAXReader reader = new SAXReader();
    		// [2]读取xml文件,得到Document对象
    		Document doc = reader.read(new File("src/scores.xml"));//打印Document对象
    		System.out.println(doc);
    		// [3]获取根元素
    		Element root = doc.getRootElement();
    		System.out.println(root.getName());//打印根元素名字
    		// [4]获取根元素下所有子元素(迭代器)
    		Iterator<?> it = root.elementIterator();
    		while(it.hasNext()) {
    			// 取出元素
    			Element e = (Element)it.next();
    			System.out.println(e.getName());
    			// 获取id属性
    			Attribute id = e.attribute("id");
    			System.out.println(id.getName() + "=" + id.getValue()); //打印子元素id
    			// 获取student的子元素
    			Element name = e.element("name");
    			Element course = e.element("course");
    			Element score = e.element("score");
    			// 打印
    			System.out.println(name.getName()+ "=" + name.getStringValue());
    			System.out.println(course.getName()+ "=" + course.getStringValue());//获取元素以下所有
    			System.out.println(score.getName()+ "=" + score.getText());//获取当前元素
    			System.out.println("----------------------------------------");
    		}
    
    	}
    
    }
    
  2. 写入xml文件中信息

package com.hb.dom4j;

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class TestXML2 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		// [1]通过DocumentHelper生成一个Document对象
		Document doc = DocumentHelper.createDocument();
		// [2]添加并得到根元素
		Element root = doc.addElement("books");
		// [3]为根元素添加子元素
		Element book = root.addElement("book");
		Element book2 = root.addElement("book");
		// [4]为book、book2元素添加属性
		book.addAttribute("id", "b01");
		book2.addAttribute("id", "b02");
		// [5]为book添加子元素
		Element name = book.addElement("name");
		Element author = book.addElement("author");
		Element price = book.addElement("price");
		// [6]为子元素添加文本信息
		book2.addElement("name").addText("long time to see");
		book2.addElement("author").addText("李四");
		book2.addElement("price").addText("4");
		name.addText("Thinking in Java");
		author.addText("田一百五十六");
		price.addText("156");
		/*// [7]将doc输出到xml文件中即可
		Writer writer = new FileWriter(new File("src/book2.xml"));
		doc.write(writer);
		// [8]关闭资源
		writer.close();*/
		// [7]格式良好的xml文件
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter writer = new XMLWriter(new FileWriter(new File("src/book2.xml")), format);
		writer.write(doc);
		// [8]关闭资源
		writer.close();
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值