11.XML技术

 XML概念和格式 

英文(eXtendible Markup Language),是一种可扩展标记语言,没有固定的标签,所有标签都可以自定义,通常用于信息的记录和传递,经常用作配置文件。

格式良好的XML文档

遵循XML文档的基本规则

  • 必须要有XML声明语句
  • 必须有且仅有一个根元素
  • 标签大小写敏感
  • 属性值用双引号
  • 标签成对
  • 元素正确嵌套
<?xml version="1.0" encoding="UTF-8"?>
<books>
<!-- 图书信息 -->
    <book id="b01">
        <name>java初级教程</name>
        <author>陈一</author>
        <price>20.5</price>
    </book>
    <book id="b02">
        <name>java中级教程</name>
        <author>陈二</author>
        <price>30.5</price>
    </book>
</books>

有效的XML文档

  • 首先必须是格式良好的
  • 使用DTD和XSD(XML Schema)定义语义约束

DTD

英文(Document Type Definition)为“文档类型定义”文档类型定义,DTD肩负着两重任务:一方面它帮助你编写合法的代码,另一方面它让浏览器正确地显示器代码。DTD分为两种:内部DTD和外部DTD。

内部DTD

demo  books.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 内部DTD -->
<!DOCTYPE books [            <!-- 定义根元素books -->
  <!ELEMENT books (book+)>   <!-- 定义books元素有2个元素book +为数量词-->
  <!ELEMENT book (name,author,price)>  <!-- 定义book元素有3个属性分别为name,author,price -->
  <!ATTLIST book id CDATA #REQUIRED>  <!-- 属性声明:给book加属性id -->
  <!ELEMENT name (#PCDATA)>  <!-- name元素为PCDATA类型(被解析文本类型) -->
  <!ELEMENT author (#PCDATA)> <!-- 同上 -->
  <!ELEMENT price (#PCDATA)>  <!-- 同上 -->
]>
<books>
<!-- 图书信息 -->
    <book id="b01">
        <name>java初级教程</name>
        <author>陈一</author>
        <price>20.5</price>
    </book>
    <book id="b02">
        <name>java中级教程</name>
        <author>陈二</author>
        <price>30.5</price>
    </book>
</books>

补充

数量词

+ 出现1次或多次,至少1次
? 出现0次或1次
* 出现任意次

常用属性

属性声明
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
    属性类型:CDATA 表示字符数据(character data)
    默认值:
        #REQUIRED  表示必须出现
        #IMPLIED   表示不是必须的

 其他属性和默认值:放在这里方便查询

外部DTD

和内部DTD声明语法完全相同,注意要去掉内部DTD声明部分

demo:  books.dtd文件

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT books (book+)>
<!ELEMENT book (name,author,price)> 
<!ATTLIST book id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>

demo:books.xml文件中使用books.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入外部dtd文件 -->
<!DOCTYPE books SYSTEM "books.dtd">  <!-- books为根元素 "books.dtd"为外部dtd文件名-->
<books>
<!-- 图书信息 -->
    <book id="b01">
        <name>java初级教程</name>
        <author>陈一</author>
        <price>20.5</price>
    </book>
    <book id="b02">
        <name>java中级教程</name>
        <author>陈二</author>
        <price>30.5</price>
    </book>
</books>

XSD

XML Schema是DTD的替代者
不仅可以规范 XML文档的结构,还可以规范文档的内容
XSD本身也是XML文档
XSD采用XML文档来定义语义约束,比DTD要复杂一些,但是功能强大的多
    支持丰富的数据类型
    允许开发者自定义数据类型
    可读性强
    可针对未来需求进行扩展

XML解析

对xml文件进行操作,包括创建xml,对xml进行增删改查操作

常见的xml解析技术

1.DOM解析

sun公司提供的解析方式,是基于XML树的解析(待补充)

2.SAX解析

民间提供的解析方式,是基于事件的解析(待补充)

3.JDOM解析

第三方提供,开源免费,比dom解析方式快(待补充)

4.DOM4J解析

第三方提供,开源免费,JDOM的升级版

demo :    读取XML文件

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 XMLDemo {
	public static void main(String[] args) throws DocumentException {
		//1.创建SAXReader对象,用来读取xml文件
		SAXReader reader = new SAXReader();
		//2.读取xml文件,得到Document对象
		Document doc = reader.read(new File("src/books.xml"));
		//System.out.println(doc);
		//3.获取根元素
		Element root = doc.getRootElement();
		//System.out.println(root.getName());
		//4.通过根元素获取子元素的迭代器,遍历子元素
		Iterator<Element> it = root.elementIterator();
		while(it.hasNext()) {
			 //取出元素
			Element e = it.next();
			System.out.println(e.getName());
			Attribute id = e.attribute("id");  //获取属性
			System.out.println(id.getName()+"="+id.getValue());
			//Iterator<Element> it.attributeIterator() 多个属性时也有迭代方法
			
			//获取子元素对象
			Element nameElement = e.element("name");
			Element authorElement = e.element("author");
			Element priceElement = e.element("price");
			System.out.println(nameElement.getName()+"="+nameElement.getText());
			System.out.println(authorElement.getName()+"="+authorElement.getText());
			System.out.println(priceElement.getName()+"="+priceElement.getText());
			System.out.println("======================");
		}
	}
}

demo :生成XML文件(生成books.xml)

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

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

public class XMLDemo2 {
	public static void main(String[] args) throws IOException {
		//1.通过DocumentHelper生成一个Document对象
		Document doc = DocumentHelper.createDocument();
		//doc.addElement("books").addElement("book").addAttribute("id", "b01");//等价于14-18行
		//下面添加元素后返回均为元素,所以可以采用链式编程,但是为了清晰,先按下面这样写
		//2.添加并得到根元素
		Element root = doc.addElement("books");
		//3.为根元素添加子元素
		Element book = root.addElement("book");
		//4.为book添加属性
		book.addAttribute("id", "b01");
		//5.为book添加子元素
		Element nameElement = book.addElement("name");
		Element authorElement = book.addElement("author");
		Element priceElement = book.addElement("price");
		//6.为子元素添加信息
		nameElement.addText("java初级编程");
		authorElement.addText("陈一");
		priceElement.addText("20.5");
		//7.将doc输出到xml文件中
/*		Writer fw = new FileWriter(new File("src/books2.xml"));
		doc.write(fw);
		//8.关闭资源
		fw.close();
		全输出到一行
		*/
		//格式良好的输出(XMLWriter类)
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xw = new XMLWriter(new FileWriter(new File("src/books2.xml")),format);
		xw.write(doc);
		//关闭资源
		xw.close();
	}

}

demo简便写法

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

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

public class XMLDemo3 {
	public static void main(String[] args) throws IOException {
		Document doc = DocumentHelper.createDocument();
		Element root = doc.addElement("books");
		//第一本书
		Element book1 = root.addElement("book").addAttribute("id", "b01");
		book1.addElement("name").addText("java初级教程");
		book1.addElement("author").addText("陈一");
		book1.addElement("price").addText("20.5");
		//第二本书
		Element book2 = root.addElement("book").addAttribute("id", "b02");
		book2.addElement("name").addText("java中级教程");
		book2.addElement("author").addText("陈二");
		book2.addElement("price").addText("30.5");
		
		//格式化输出
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xw = new XMLWriter(new FileWriter(new File("src/books3.xml")),format);
		xw.write(doc);
		//关闭资源
		xw.close();
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值