XML编程的解析过程

一、XML解析技术概述

XML解析方式分为两种:dom和sax
dom:(Document Object Model,即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。
sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。
XML解析器
Crimson、Xerces 、Aelfred2

二、获得JAXP中的DOM解析器
调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM
解析器的工厂。
调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表

整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

更新XML文档:利用Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:javax.xml.transform.dom.DOMSource类来关联要转换的document对象,用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。
Transformer对象通过TransformerFactory获得。

三、使用dom方式对xml文档进行crud

	/**
	 * 读取xml文档中节点中的值 
	 * @throws Exception
	 */
@Test
public void test() throws Exception{
	//调用DocumentBuilderFactory.newInstance() 方法得到创建DOM解析器的工厂
	DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
	//调用工厂对象的newDocumentBuilder方法得到DOM解析器对象
	DocumentBuilder builder=builderFactory.newDocumentBuilder();
    /*File file=new File("/day24/src/fuxi.xml");
	System.out.println(file+"-----");*/
	//解析指定的文件
	Document  document=builder.parse(this.getClass().getClassLoader().getResourceAsStream("src//fuxi.xml"));
    //getInfo(document);
	list(document);
	
}
/**
 * 遍历文档
 * @param document
 */
public void list(Document document) {
NodeList  nodeList=document.getElementsByTagName(document.getDoctype().getName());
for (int i = 0; i < nodeList.getLength(); i++) {
	//获取指定的节点
	Node node=nodeList.item(i);
	listNode(node);
}
}
public void listNode(Node node) {
	//节点是什么类型的节点
	if (node.getNodeType()==1) {//判断是否是元素节点
		Element element=(Element) node;
		if (element.hasAttributes()) {
			NamedNodeMap namenm=element.getAttributes();//Node
			for (int k = 0; k < namenm.getLength(); k++) {
               Attr attr=(Attr) namenm.item(k);
               System.out.println("name:::"+attr.getNodeName()+"value:::"+attr.getNodeValue()+"type::"+attr.getNodeType());
			}
		}
		NodeList   listnode=element.getChildNodes();
		for (int j = 0; j <listnode.getLength(); j++) {
			Node nd=listnode.item(j);
			 System.out.println("name:::"+nd.getNodeName()+"value:::"+nd.getNodeValue()+"type::"+nd.getNodeType());
			 listNode(nd);
		}
	}
}

四、根据document对象获取一些相关的信息

public void getInfo(Document document) {
	System.out.println("版本号:"+document.getXmlVersion());//version="1.0"
	System.out.println("DOCTYPE:"+document.getDoctype().getNodeType());
	System.out.println("跟标签::"+document.getDoctype().getName());
	System.out.println("SYSTEM ID::"+document.getDoctype().getSystemId());
}

五、类型的值
public void testTypeValue() {
		System.out.println("属性节点的类型值:" + Node.ELEMENT_NODE);//元素节点类型为1
		System.out.println("属性节点的类型值:" + Node.ATTRIBUTE_NODE);//属性节点类型为2
		System.out.println("属性节点的类型值:" + Node.TEXT_NODE);//文本节点类型为3
		System.out.println("属性节点的类型值:" + Node.ENTITY_NODE);//实体节点类型为6
		System.out.println("属性节点的类型值:" + Node.COMMENT_NODE);//注释节点类型为8
		System.out.println("属性节点的类型值:" + Node.DOCUMENT_NODE);//文档节点类型为9
		System.out.println("属性节点的类型值:" + Node.DOCUMENT_TYPE_NODE);//节点声明的类型为10
	}

六、Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加修改删除XML文档的内容了。

@Test
	public void test() throws SAXException,IOException,ParserConfigurationException {
		Document document = DocumentBuilderFactory
				.newInstance()
				.newDocumentBuilder()
				.parse(this.getClass

().getClassLoader()
						

.getResourceAsStream("parsers//java.xml"));

		// findNodeByAttrValue(document,"Boss姚");
		// findNodeById(document,"x121");
		try {
			// deleteNodeById(document,"x121");
			// updateNodeById(document,"x121");
			addNodeById(document,"x121");
		} catch (TransformerException e) {
			System.out.println("异常信息出现了。。。

。。。。");
			e.printStackTrace();
		}
	}

	/**
	 * 根据标签名称查找所有该名称的节点对象
	 */
	public void findNode(Document document) {
		//根据标签名称获取名称的所有节点对象
		NodeList nodelist = 

document.getElementsByTagName("teacher");
		//遍历
		for (int i = 0; i < nodelist.getLength(); i++) {
			//得到具体的某个节点对象
			Node node = nodelist.item(i);
			System.out.println(node.getNodeName());
		}
	}

	/**
	 * 根据属性的值 查询某个节点对象
	 * 属性值是唯一(假设)
	 * @param document
	 * @param value
	 * @return
	 */
	public Node findNodeByAttrValue(Document document,String value) {
		//根据标签名称获取名称的节点对象集合
		NodeList nodelist = 

document.getElementsByTagName("teacher");
		//遍历
		for (int i = 0; i < nodelist.getLength(); i++) {
			//获取某个具体的元素节点对象
			Element node = (Element) nodelist.item

(i);
			//根据属性名称获取该节点的属性节点对象
			Attr attr = node.getAttributeNode

("name");
			//获取属性节点的值是否给指定的节点属性值

相同
			if (attr.getNodeValue().equals(value)) {
				//返回此节点
				return node;
			}
		}
		return null;
	}

	/**
	 * 根据id获取某个节点对象
	 * 
	 * @param document
	 * @param id
	 * @return
	 */
	public Node findNodeById(Document document,String id) {
		return document.getElementById(id);
	}

	/**
	 * 删除某个节点对象
	 * 
	 * @param document
	 * @param id
	 * @throws TransformerException
	 */
	public void deleteNodeById(Document document,String id)
			throws TransformerException {
		//获取删除的节点对象
		Node node = document.getElementById(id);
		// 是通过父节点调用removeChild(node)把子节点给删

除掉
		Node node1 = node.getParentNode().removeChild

(node);
		
		//创建TransformerFactory对象
		TransformerFactory transformerFactory = 

TransformerFactory
				.newInstance();
		//Transformer类用于把代表XML文件的Document对象转

换为某种格式后进行输出
		//Transformer对象通过TransformerFactory获得
		Transformer transformer = 

transformerFactory.newTransformer();
		// 把Document对象又重新写入到一个XML文件中。
		transformer.transform(new DOMSource(document),new StreamResult(
				new File("src//a.xml")));
	}

	/**
	 * 更新某个节点
	 * 
	 * @param document
	 * @param id
	 * @throws TransformerException
	 */
	public void updateNodeById(Document document,String id)
			throws TransformerException {
		//根据id获取元素指定的元素节点对象
		Element node = document.getElementById(id);
		//获取元素节点的id属性节点对象
		Attr attr = node.getAttributeNode("id");
		//修改元素节点的属性值
		attr.setValue("x122");

		//获取该节点对象的所有孩子节点对象name、age、sex

节点
		NodeList nodelist = node.getChildNodes();
        //遍历
		for (int i = 0; i < nodelist.getLength(); i++) {
			//得到具体的节点对象
			Node n = nodelist.item(i);
			//判断是否是元素节点对象
			if (n.getNodeType() == 

Node.ELEMENT_NODE) {
				//看是否是name节点
				if (n.getNodeName().equals

("name")) {
					n.setTextContent("君

君");//修改其值
				} else if (n.getNodeName

().equals("age")) {//看看是否是age节点
					n.setTextContent

("80");//修改其值
				} else if (n.getNodeName

().equals("sex")) {//看看是否是sex节点
					n.setTextContent

("男");//修改其值
				} else {
					System.out.println("不做

处理");
				}
			}
		}

		//创建TransformerFactory对象
		TransformerFactory transformerFactory = 

TransformerFactory
				.newInstance();
		//Transformer类用于把代表XML文件的Document对象转

换为某种格式后进行输出
		//Transformer对象通过TransformerFactory获得
		Transformer transformer = 

transformerFactory.newTransformer();
		//把Document对象又重新写入到一个XML文件中。
		transformer.transform(new DOMSource(document),new StreamResult(
				new File("src//b.xml")));
	}

	/**
	 * 在指定的节点下方添加新某个节点
	 * 
	 * @param document
	 * @param id
	 * @throws TransformerException
	 */
	public void addNodeById(Document document,String id)
			throws TransformerException {
		Element node = document.getElementById(id);
		Node parentNode = node.getParentNode();

		Element nd = document.createElement("student");

		nd.setAttribute("id","x123");

		Node name = document.createElement("name");
		name.appendChild(document.createTextNode("陈红军

"));
		Node age = document.createElement("age");
		age.appendChild(document.createTextNode("20"));
		Node sex = document.createElement("sex");
		sex.appendChild(document.createTextNode("男"));

		nd.appendChild(name);
		nd.appendChild(age);
		nd.appendChild(sex);

		parentNode.appendChild(nd);

		//创建TransformerFactory对象
		TransformerFactory transformerFactory = 

TransformerFactory
				.newInstance();
		//Transformer类用于把代表XML文件的Document对象转

换为某种格式后进行输出
		//Transformer对象通过TransformerFactory获得
		Transformer transformer = 

transformerFactory.newTransformer();
		//把Document对象又重新写入到一个XML文件中。
		transformer.transform(new DOMSource(document),new StreamResult(
				new File("src//c.xml")));
	}

七、XML和HTML的区别:
XML与HTML的设计区别是:XML被设计为传输和存储数据,其焦点是数据的内容。而HTML被设计用来显示数据,其焦点是数据的外观。HTML旨在显示信息,而 XML旨在传输信息。
XML和HTML语法区别:HTML的标记不是所有的都需要成对出现,XML则要求所有的标记必须成对出现;HTML标记不区分大小写,XML则大小敏感,即区分大小写。

相关文章

引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而产生的。具体...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
http://blog.jobbole.com/79252/ 引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满...
(点击上方公众号,可快速关注) 公众号:smart_android 作者:耿广龙|loonggg 点击“阅读原文”,可查看...
一、xml与xslt 相信所有人对xml都不陌生,其被广泛的应用于数据数据传输、保存与序列化中,是一种极为强...