JAPX(JAVA API for xml)中dom解析思路

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persons[
  <!ELEMENT persons (person+)>
  <!ELEMENT person (name,age,addr)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT age (#PCDATA)>
  <!ELEMENT addr (#PCDATA)>
  <!ATTLIST  person
     id ID #REQUIRED
     >
    
]>
<persons>
	<person id="1">
		<name>小刘</name>
		<age>25</age>
		<addr>兰州交通大学</addr>
	</person>
	<person id="2">
		<name>小张</name>
		<age>24</age>
		<addr>西北师范大学</addr>
	</person>
</persons>

解析代码

package com.water.coder;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * @author Administrator
 * JackHall 又称
 * WaterCoder 简称wc
 */
public class TestForXmlParse {
	// 每个函数都是一个测试函数
	@Test
	public void testDom01() throws ParserConfigurationException, SAXException,
			IOException {
		// 建立解析工厂
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		// 建立解析器
		DocumentBuilder db = dbf.newDocumentBuilder();
		// 加载文档
		Document document = db.parse(new File("Person.xml"));
		// 通过名字获取标签
		NodeList list = document.getElementsByTagName("name");
		// 了解No的List和Node的用法,如何遍历
		for (int i = 0; i < list.getLength(); i++) {
			Element elem = (Element) list.item(i);
			// 获取元素的文本内容
			String text = elem.getTextContent();
			System.out.println("人名:" + text);
		}
	}

	@Test
	public void testDom02() throws ParserConfigurationException,
			SAXException, IOException {
		// Dom解析三步骤:
		// 1.获取解析工厂
		// 2.获取解析器
		// 3.加载文档,并获取文档节点
		// 4.进行需求的解析
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document document = db.parse(new File("Person.xml"));

		// 解析具体的对象时,一般分为两种办法
		// 1.通过获取他们的父节点
		// 2.通过获取他们的兄弟节点
		
		//在这里你需要理解一个点:
/*		<person>
			<name>小刘</name>
			<age>25</age>
			<addr>兰州交通大学</addr>
	     </person>
	     person下面的第一个节点为回车换行<name>为第二个节点(访问时item(1))
	     person下面的第三个节点为回车换行<age>为第四个节点(访问时item(3))
	     person下面的第四个节点为回车换行<addr>为第五个节点(访问时item(5))
*/

		// 需求1:获取小刘的地址
		// 1。获取父节点
		NodeList list = document.getElementsByTagName("person");
		for (int i = 0; i < list.getLength(); i++) {
			// 获取本节点
			Element person = (Element) list.item(i);
			// 获取子节点
			NodeList childList = person.getChildNodes();
			// 下面一般要你了解自己的数据结构
			// 我的名字存储在person下面的第一个节点
			Element pName = (Element) childList.item(1);
			// 如果名字等于你要查找的名字
			if (pName.getTextContent().equals("小刘")) {
				// 地址存放在Person下的第5个
				Element pAddr = (Element) childList.item(5);
				System.out.println("小刘的地址为" + pAddr.getTextContent());
			}

		}
		
		
		// 需求2:获取小张的年龄
		NodeList pNameList = document.getElementsByTagName("name");
		
		for(int i = 0;i<pNameList.getLength();i++)
		{
			//获取对应的姓名节点
			Element pName = (Element)pNameList.item(i);
			//判断
			if(pName.getTextContent().equals("小张"))
			{
				//找到节点后
				//因为节点与节点之间相聚比较多,使用函数封装一下,否则代码看起来不整洁
				Element pAge = getPAddr(pName);
				System.out.println("小张的年龄"+pAge.getTextContent());
			}
		}
		
	}
	
	//获取这个结构中的年龄节点
	public Element getPAddr(Element pName)
	{
		//getNextSibling获取下一个节点,和上面的一样有文本节点和元素节点
		Element pAge = (Element)pName.getNextSibling().getNextSibling();
		return pAge;
	}
	@Test
	public void testDom03() throws ParserConfigurationException, SAXException, IOException
	{
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document document = db.parse(new File("Person.xml"));
		
		//获取节点通过getElementById();
		//ID是文档约束,不仅仅是属性而已
		//如果只是属性那么下面获取的就是空指针了
		
		Element eml = document.getElementById("1");
		if(eml!=null)
		{
			System.out.println(eml.getNextSibling().getNextSibling().getTextContent());
		}
	}
	@Test
	public void testDom04() throws ParserConfigurationException, SAXException, IOException, TransformerException
	{
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.parse(new File("Person.xml"));
		
		TransformerFactory tff = TransformerFactory.newInstance();
		Transformer tf = tff.newTransformer();
		DOMSource domSource = new DOMSource(doc);
		StreamResult sr = new StreamResult(new File("Person_bak.xml"));
		tf.transform(domSource, sr);
	}
	
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值