XML编程(day01)

一、小结

*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元</售价>
	</书>
	...
</书架>


XML使用DOCTYPE声明语句来指明它所遵循的DTD文档,有两种形式:
当引用的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方式:一棵树。


5、Jaxp进行DOM方式解析的主要类和方法

DocumentBuilderFactory:

avax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

DocumentBuilder

用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

Document


Node
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"));
	}
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值