一、xml
1.什么是XML:
是一种可扩展的标记语言,所有标记都可以自定义,常用来做配置文件和数据传输的载体
2.语法:
标签(元素):<元素名> 值 </元素名>
属性:在元素中 <元素名 属性名="值" 属性名="值" ...></元素名>
注意:元素可以嵌套,但不能交叉
补充:字符集编码
gbk,gb2312:这两种都是支持中文编码的
iso-8859-1:这是计算机默认的纯英文字符集编码
utf-8:国际字符集编码,也支持中文
xml注释:<!-- 注释内容 -->
3.dtd文档
作用是对xml文档的一个约束,可以直接写在xml文档中,也可以写外部文件中然后被引用
4.dtd语法:
PCDATA和CDATA的区别:他们都是dtd中的数据类型,PCDATA用来修饰元素会被解析,CDATA用来修饰属性不会被解析
符号:
*:表示任意匹配次数
+:1到多次
?:0-1次匹配
#REQUIRED:表示该属性必须出现
5.外部dtd文件的引入
a.系统内部引用,只能在当前系统,关键字:SYSTEM
<!DOCTYPE students SYSTEM "student.dtd">
b.公共引用,是通过网络,关键字:PUBLIC
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<!DOCTYPE students[
<!ELEMENT students (student+)>
<!ELEMENT student (name,gender,age,address)>
<!ATTLIST student xh CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT gender (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT address (city,street,zip)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT zip (#PCDATA)>
]>
练习:
1.请写一个xml用来描述老师的信息
要求符合语法,能用浏览器渲染
2.写一个dtd文件
要求:
根元素是books
books元素下可以有1个或者多个book元素
book元素有bookid属性,并且必须出现
book元素下有 name,price,count,addr元素
addr元素可以为任意次数
addr元素下有 city,street元素
二.对于xml文档的解析与创建
1.解析就是将xml文档的内容读取到程序中
2.创建就是将程序中的数据封装到xml文件中
Dom解析过程:
把整个xml文档看做一个Document对象
xml文档中的所有元素包括标签和属性都称为节点(Node对象)
Node对象可以分为Element(元素)和Attribute(属性)
所有的数据对象是Text
1.解析过程
先获取document对象,再获取根节点,再一层层获取子节点
2.创建xml的过程
先创建一个document对象,再创建根节点,再创建所有的子节点,再把所有的子节点追加到相应的父节点,最后把文档对象输出
三、例子
student.dtd
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!ELEMENT students (student+)> 3 <!ELEMENT student (age,sex,phone,addr)> 4 <!ATTLIST student id CDATA #REQUIRED> 5 <!ELEMENT addr (contry,city,street)> 6 <!ELEMENT age (#PCDATA)> 7 <!ELEMENT sex (#PCDATA)> 8 <!ELEMENT phone (#PCDATA)> 9 <!ELEMENT contry (#PCDATA)> 10 <!ELEMENT city (#PCDATA)> 11 <!ELEMENT street (#PCDATA)>
student.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- <!DOCTYPE students[ 3 <!ELEMENT students (student+)> 4 <!ELEMENT student (age,sex,phone,addr)> 5 <!ATTLIST student id CDATA #REQUIRED> 6 <!ELEMENT addr (contry,city,street)> 7 <!ELEMENT age (#PCDATA)> 8 <!ELEMENT sex (#PCDATA)> 9 <!ELEMENT phone (#PCDATA)> 10 <!ELEMENT contry (#PCDATA)> 11 <!ELEMENT city (#PCDATA)> 12 <!ELEMENT street (#PCDATA)> 13 ]> --> 14 <!DOCTYPE students SYSTEM "student.dtd"> 15 <Students> 16 <student id="001"> 17 <age>20</age> 18 <sex>男</sex> 19 <phone>119</phone> 20 <addr> 21 <contry>中国</contry> 22 <city>长沙</city> 23 <street>芙蓉路</street> 24 </addr> 25 </student> 26 <student id="002"> 27 <age>20</age> 28 <sex>男</sex> 29 <phone>119</phone> 30 <addr> 31 <contry>中国</contry> 32 <city>长沙</city> 33 <street>芙蓉路</street> 34 </addr> 35 </student> 36 <student id="003"> 37 <age>20</age> 38 <sex>男</sex> 39 <phone>119</phone> 40 <addr> 41 <contry>中国</contry> 42 <city>长沙</city> 43 <street>芙蓉路</street> 44 </addr> 45 </student> 46 </Students>
books.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <books> 3 <book id="hwua0001"> 4 <name>java入门</name> 5 <price>34.00</price> 6 <count>200</count> 7 <author>allen</author> 8 <datetime>2017-01-01</datetime> 9 </book> 10 <book id="hwua0002"> 11 <name>java初级</name> 12 <price>46.00</price> 13 <count>104</count> 14 <author>allen</author> 15 <datetime>2016-11-12</datetime> 16 </book> 17 <book id="hwua0003"> 18 <name>java精通</name> 19 <price>88.00</price> 20 <count>100</count> 21 <author>allen</author> 22 <datetime>2017-04-11</datetime> 23 </book> 24 <book id="hwua0004"> 25 <name>java放弃</name> 26 <price>10000</price> 27 <count>300</count> 28 <author>allen</author> 29 <datetime>2016-05-23</datetime> 30 </book> 31 </books>
xml文件读取解析实例:
1 package com.demo1122; 2 3 import java.io.FileWriter; 4 import java.io.IOException; 5 import java.io.Writer; 6 7 import javax.xml.parsers.DocumentBuilder; 8 import javax.xml.parsers.DocumentBuilderFactory; 9 import javax.xml.parsers.ParserConfigurationException; 10 11 import org.junit.Test; 12 import org.w3c.dom.Document; 13 import org.w3c.dom.Element; 14 import org.w3c.dom.Node; 15 import org.w3c.dom.NodeList; 16 import org.xml.sax.SAXException; 17 18 import com.sun.org.apache.xml.internal.serialize.OutputFormat; 19 import com.sun.org.apache.xml.internal.serialize.XMLSerializer; 20 21 public class XmlDemo { 22 @Test 23 public void praseXml() throws Exception { 24 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 25 DocumentBuilder db;// xml的文档构建对象 26 db = dbf.newDocumentBuilder(); 27 28 Document dom = db.parse("src/com/demo1122/student.xml");// 把文件路径解析成一个document对象 29 30 // 获取根节点 31 Element root = dom.getDocumentElement(); 32 // 获取根节点下的子节点 33 NodeList stus = root.getChildNodes(); 34 // 迭代所有子节点 35 for (int i = 0; i < stus.getLength(); i++) { 36 if (stus.item(i).getNodeType() == 1) { 37 Element stu = (Element) stus.item(i); 38 String id = stu.getAttribute("id"); 39 System.out.println("id" + id); 40 NodeList stuAttr = stu.getChildNodes();// 继续获取子节点下的所有子节点 41 for (int j = 0; j < stuAttr.getLength(); j++) { 42 if (stuAttr.item(j).getNodeType() == 1) { 43 System.out.println(stuAttr.item(j).getNodeName() + "=" + stuAttr.item(j).getTextContent()); 44 } 45 } 46 } 47 } 48 } 49 50 @Test 51 public void createXml() throws Exception { 52 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 53 DocumentBuilder db;// xml的文档构建对象 54 db = dbf.newDocumentBuilder(); 55 56 Document doc = db.newDocument();// 创建一个新的document对象 57 58 // 创建一个元素 59 Element root = doc.createElement("animals"); 60 61 // 继续创建子节点,为animals的子节点 62 Element animal = doc.createElement("animal"); 63 animal.setAttribute("id", "an1001");// 为元素设置属性 64 65 // 继续为animal创建子节点 66 Element type = doc.createElement("type"); 67 type.setTextContent("狗");// 为元素设置值 68 69 Element name = doc.createElement("name"); 70 name.setTextContent("中华神犬"); 71 72 // 把元素之间的关系追加 73 animal.appendChild(type); 74 animal.appendChild(name); 75 root.appendChild(animal); 76 doc.appendChild(root); 77 78 // 将doc写入文件 79 // 将构建好的document输出到xml文档 80 OutputFormat format = new OutputFormat(doc); 81 format.setEncoding("gbk"); 82 Writer w = new FileWriter("src/com/demo1122/animals.xml"); 83 XMLSerializer xs = new XMLSerializer(w, format); 84 xs.asDOMSerializer();// 作为DOM的方式去序列化文档 85 xs.serialize(doc.getDocumentElement());// 输出根元素 86 w.close(); 87 } 88 }
animals.xml
1 <?xml version="1.0" encoding="gbk"?> 2 <animals> 3 <animal id="an1001"> 4 <type>狗</type> 5 <name>中华神犬</name> 6 </animal> 7 </animals>