作用:
1.常用来作为配置文件。
2.在不同的系统之间传递数据。
Xml也可以形成一个树型结构,它里面每一个叫做节点,节点也分成了元素结点(Element) 属性节点(Attribute) 文本节点(Text) 整体也是一个节点,它叫做document.
xml组成
文档声明、属性(避免属性,不易扩展、不易阅读、无法描述为树形结构)、元素、注释、CDATA区域(不被解析,原样展示)、PI指令
PI指令:<?xml-stylesheet type="text/css" href="demo.css"?>
xml约束文件
约束就规定了xml文件中可以写什么,不可以写什么。
种类:
1.DTD约束
2.SCHEMA约束(DTD的替代者)
DTD与xml进行关联
1.内部关联
2.外部关联
a:关联本地文件
格式<!DOCTYPE xml文件根元素 SYSTEM “DTD文件的本地URL”>
b:关联网络上公共文件
格式 <!DOCTYPE 文件根元素 PUBLIC “DTD名称” “DTD文件的URL”>
Dtd与schema区别
1. dtd不遵守xml语法,而schema它遵守xml语法,它本质上就是一个xml
2. dtd数据类型不完善,而schema它有丰富数据类型
3. dtd只能有一个应用于xml文件,使用schema可以多个schema约束xml文件。
xsd文件叫做模式文档(约束文档),管xml文件,实例文档。
编写一个xml shcema约束文档后,通常需要将这个文件中声明的元素绑定到一个URI地址上,在xml schema技术中我们管这个过程叫做将声明的元素绑定到名称空间。以后,我们的xml文件被解析引擎解析时,可以知道我们这些xml文件中的元素来自哪里,被谁约束。
xml解析所谓的xml解析就是对xml文件进行读写操作。
Xml解析方式分为两种:
1. dom
document object model 即文档对象模型,它是w3c组织推荐的解析xml的一种方式。
2. sax
simple api for xml 不是官方标准,它是xml 社区事实上的标准,几乎所有的xml解析器都支持它
Dom与sax解析方式区别
Dom:
1. dom解析方式它是将整个xml文件载入内存,以树型结构来存储
2. dom支持回写 可以对xml文件中内容进行crud操作
3. 如果文件内容比较大,不建议使用dom解析。
Sax
1. 相比dom,sax是一种更为轻量级解决方案
2. 采用串行读取方式,逐行读取,读取一行解析一行。
3. 编程比较复杂
4. sax只能读取,不能对xml进行修改。
Dom解析CRUD案例package com.inphase.xml;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import com.sun.xml.internal.bind.unmarshaller.DOMScanner;
public class DomTest01 {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException {
File file= new File("WebRoot/Demo/bookstore.xml");
//1.得到dom的解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2.得到解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
//3.通过解析器对象来获取Document对象、
Document document = builder.parse(file);
//4.对xml进行操作
//得到xml下所有的book元素
delete(document,file);
}
//查询
public static void select(Document document){
NodeList nodeList = document.getElementsByTagName("book");
// 遍历list得到book元素
for (int i = 0; i < nodeList.getLength(); i++) {
Element book = (Element) nodeList.item(i);
String category = book.getAttribute("category");
//得到booK下的所有子元素
NodeList childNodes = book.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node child = childNodes.item(j);
if (child.getNodeType()==Node.ELEMENT_NODE) { //判断是一个元素
//得到文本信息
String text = child.getTextContent();
System.out.println(text);
}
}
}
}
//创建操作
public static void create(Document document , File file) throws TransformerException{
//创建元素
Element book = document.createElement("book");
book.setAttribute("category", "java");
Element title = document.createElement("title");
title.setAttribute("lang", "en");
title.setTextContent("编程思想");
Element author = document.createElement("author");
author.setTextContent("EKR");
Element year = document.createElement("year");
year.setTextContent("2017");
Element price = document.createElement("price");
price.setTextContent("99.97");
//添加元素
book.appendChild(title);
book.appendChild(author);
book.appendChild(year);
book.appendChild(price);
Element root = (Element) document.getElementsByTagName("bookstore").item(0);
root.appendChild(book);
//回写
//得到一个TransformerFactory对象
TransformerFactory factory = TransformerFactory.newInstance();
//通过TransformerFactory得到一个Transformer对象
Transformer tf = factory.newTransformer();
//通过Transformer通过transform方法完成滴
tf.transform(new DOMSource(document), new StreamResult(file));
}
//修改操作
public static void update(Document document , File file) throws TransformerException{
Element book = (Element) document.getElementsByTagName("book").item(3);
Element title = (Element) book.getElementsByTagName("title").item(0);
title.setAttribute("lang", "中文");
title.setTextContent("java编程思想");
//回写
TransformerFactory factory = TransformerFactory.newInstance();
//通过TransformerFactory得到一个Transformer对象
Transformer tf = factory.newTransformer();
//通过Transformer通过transform方法完成滴
tf.transform(new DOMSource(document), new StreamResult(file));
}
//删除操作
public static void delete(Document document , File file) throws TransformerException{
Element book = (Element) document.getElementsByTagName("book").item(3);
//删除book的category属性
book.removeAttribute("category");
//回写
TransformerFactory factory = TransformerFactory.newInstance();
//通过TransformerFactory得到一个Transformer对象
Transformer tf = factory.newTransformer();
//通过Transformer通过transform方法完成滴
tf.transform(new DOMSource(document), new StreamResult(file));
}
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?><bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
<book>
<title lang="中文">java编程思想</title>
<author>EKR</author>
<year>2017</year>
<price>99.97</price>
</book>
</bookstore>