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:
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>