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则大小敏感,即区分大小写。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇