XML编程的解析过程

前端之家收集整理的这篇文章主要介绍了XML编程的解析过程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、XML解析技术概述@H_404_3@

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

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

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

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

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

	/**
	 * 读取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对象获取一些相关的信息

@H_404_3@

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文档的内容了。

@H_404_3@

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

猜你在找的XML相关文章