*1、xml的作用
XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言,很类似HTML。它被设计的宗旨是传输数据,而非显示数据。
XML标签没有被预定义,需要用户自行定义标签。
XML技术是W3C组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。
XML被广泛认为是继Java之后在Internet上最激动人心的新技术。
*2、xml的语法
<?xml version="1.0" encoding="UTF-8"?>
<中国>
<北京>
<海淀></海淀>
<丰台></丰台>
</北京>
<山东>
<济南></济南>
<青岛></青岛>
</山东>
<湖北>
<武汉></武汉>
<荆州></荆州>
</湖北>
</中国>
3、DTD验证
DTD(Document Type Definition) 是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分。DTD 是一种保证XML文档格式正确的有效方法,可通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。XML文件提供应用程序一个数据交换的格式,DTD正是让XML文件能成为数据交换标准,因为不同的公司只需定义好标准DTD,各公司都能依DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。DTD文件是一个ASCII文本文件,后缀名为.dtd。
*xml中引入dtd文档
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
<书>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00元</售价>
</书>
...
</书架>
当引用的DTD文档在本地时,采用如下方式:
<!DOCTYPE 根元素 SYSTEM “DTD文档路径”>
如:<!DOCTYPE 书架 SYSTEM “book.dtd”>
当引用的DTD文档在公共网络上时,采用如下方式:
<!DOCTYPE 根元素 PUBLIC “DTD名称” “DTD文档的URL”>
如:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
4、xml解析
XML解析方式分为两种:DOM方式和SAX方式
DOM:Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。
SAX:Simple API for XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。
*DOM方式:一棵树。
DocumentBuilderFactory:
avax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
DocumentBuilder
用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
Document
Element
NodeList
6、小案例
<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
<书 ISBN="abc" 出版社="黑马训练营">
<书名>Java就业培训教程</书名>
<作者>王昭珽</作者>
<批发价>10</批发价>
<售价>39.00元</售价>
</书>
<书 ISBN="abcd" 出版社="传智播客">
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价>29.00元</售价>
</书>
</书架>
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.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;
/**
* @author wzhting
* 利用Jaxp解析开发包,进行DOM方式解析xml文档
*/
public class JaxpCRUD {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//得到解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//得到解析器
DocumentBuilder builder = factory.newDocumentBuilder();//ctrl+1
//得到代表整棵树的Document对象
Document document = builder.parse("src/book.xml");
// test1(document);
// test2(document);
// test3(document);
// test4(document);
// test5(document);
// test6(document);
// test7(document);
test8(document);
}
// 1、得到某个具体的节点内容
//打印第2本书的作者元素的主体内容
private static void test1(Document document){
NodeList list = document.getElementsByTagName("作者");
// System.out.println(list.getLength());
Node node = list.item(1);
String content = node.getTextContent();//获取主体内容
System.out.println(content);
}
// 2、遍历所有元素节点
private static void test2(Node node){
//判断node是不是一个元素节点,如果是,打印它的名字
short type = node.getNodeType();//节点类型
if(Node.ELEMENT_NODE==type){
System.out.println(node.getNodeName());
}
//得到他的所有子节点,循环遍历
NodeList list = node.getChildNodes();
for(int i=0;i<list.getLength();i++){
Node n = list.item(i);
test2(n);
}
}
// 3、修改某个元素节点的主体内容
//修改第2本书的内容为29.00
private static void test3(Document document) throws Exception{
Node node = document.getElementsByTagName("售价").item(1);
node.setTextContent("29.00元");
//写回xml文件
TransformerFactory tf = TransformerFactory.newInstance();
Transformer ts = tf.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}
// 4、向指定元素节点中增加子元素节点
//在第1本书中增加子元素节点,<内部价>58</内部价>
private static void test4(Document document)throws Exception{
//得到第1本书
Node n = document.getElementsByTagName("书").item(0);
//创建新的元素,并设置主体内容
Element e = document.createElement("内部价");
e.setTextContent("58");
//建立关系
n.appendChild(e);
//写回xml文件
TransformerFactory tf = TransformerFactory.newInstance();
Transformer ts = tf.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}
// 5、向指定元素节点上增加同级元素节点
//在第一本书的售价前面插入<批发价>10</批发价>
private static void test5(Document document)throws Exception{
//得到第1个售价
Node node = document.getElementsByTagName("售价").item(0);
//创建新元素
Element e = document.createElement("批发价");
e.setTextContent("10");
//建立关系
node.getParentNode().insertBefore(e, node);//
//写回xml文件
TransformerFactory tf = TransformerFactory.newInstance();
Transformer ts = tf.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}
// 6、删除指定元素节点
//删除内部价
private static void test6(Document document)throws Exception{
Node n = document.getElementsByTagName("内部价").item(0);
n.getParentNode().removeChild(n);
//写回xml文件
TransformerFactory tf = TransformerFactory.newInstance();
Transformer ts = tf.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}
// 7、操作XML文件属性:获取第1本书的 出版社属性
private static void test7(Document document){
Node n = document.getElementsByTagName("书").item(0);
Element e = (Element)n;
System.out.println(e.getAttribute("出版社"));
}
private static void test8(Document document)throws Exception{
Node n = document.getElementsByTagName("书").item(1);
Element e = (Element)n;
e.setAttribute("出版社", "传智播客");
//写回xml文件
TransformerFactory tf = TransformerFactory.newInstance();
Transformer ts = tf.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}
}