java解析XML的Dom和Sax初步使用

xml代码

<?xml version="1.0" encoding="UTF-8"?>
<pets>
	<dogs>
		<dog id="1" >			
			<name>YAYA</name>
			<health>100</health>
			<love>0</love>
			<strain>酷酷的雪娜瑞</strain>
		</dog>
		<dog id="2">			
			<name>OUOU</name>
			<health>90</health>
			<love>15</love>
			<strain>聪明的拉布拉多犬</strain>
		</dog>
	</dogs>
</pets>

bean

package test20141213;

public class Dog {
	public int id;
	public String name;
	public int age;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Dog [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
}


Dom

1.我们可以通过DocmentBuilder解析一个xml文件获得文档树,通过文档树获得其根节点的子节点。

2.可以直接把属性直接写在节点标签内,通过node.getAttribute().getNamedItem("指定的属性").getTextContent();来获取对应的属性值

就像这样

<dog id="1" >	
</dog>


3也可以把值写在其子节点里,先获取其dog节点的集合,通过for循环得到每个节点的子节点,在循环判断每个节点的nodeName,通过getTextContent()方法获取到值

就像这样

			<name>YAYA</name>
			<health>100</health>
			<love>0</love>
			<strain>酷酷的雪娜瑞</strain>

下面是Dom方式解析xml文件代码

package test20141213;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

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

public class demo1 {
	public static void main(String[] args) {
		domParseTest();
	}
	public static void domParseTest(){
		DocumentBuilderFactory dbf=null;
		DocumentBuilder db=null;
		Document doc=null;
		List<Dog> doglist=new ArrayList<Dog>();
		try {
			dbf=DocumentBuilderFactory.newInstance();
			db=dbf.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
		}
		try {
			doc = db.parse(new File("pet.xml"));
		} catch (SAXException e1) {
		} catch (IOException e1) {
			// TODO 自动生成的 catch 块
			e1.printStackTrace();
		}
		//得到文档树根节点
		Element e=doc.getDocumentElement();
		//得到标签名为dog的节点集合
		NodeList petList=e.getElementsByTagName("dog");
		//遍历节点集合
		System.out.println(petList.getLength());
		for(int i=0;i<petList.getLength();i++){
			Dog dog=new Dog();
			Node node=petList.item(i);
			String id=node.getAttributes().getNamedItem("id").getTextContent();
			System.out.println("dog的id属性是:"+id);
			/*
			 * 得到其属性集合,得到指定属性的值
			 * <pets>
				<dogs>
					<dog id="1" >			
					<name>YAYA</name>
					<age>100</age>
				</dog>
				<dog id="2">			
						<name>OUOU</name>
						<age>102</age>
					</dog>
				</dogs>
			</pets>
			得到node的Attribute是dog标签里的id,想要得到其子标签的值需要getChildNodes
			*/
			dog.setId(Integer.parseInt(node.getAttributes().getNamedItem("id").getTextContent()));
			/*
			 * 得到子节点集合
			 * 通过子节点的getNodeName判断是哪一个标签
			 * 然后给这个标签的字段赋值
			 */
			NodeList childNodeList=node.getChildNodes();
			for(int j=0;j<childNodeList.getLength();j++){
				Node childNode=childNodeList.item(j);
				if(childNode.getNodeName().equals("name"))
					dog.setName(childNode.getTextContent());
				if(childNode.getNodeName().equals("age"))
					dog.setAge(Integer.parseInt(childNode.getTextContent()));
			}
			doglist.add(dog);
		}
		for(Dog d:doglist){
			System.out.println(d);
		}
	}
}

sax解析

1.sax解析首先要先继承defaultHandler,主要注意有五个主要的触发器

package test20141213;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class PetHanlder extends DefaultHandler {
	public void startDocument() throws SAXException {
		
	}
	public void startElement(String uri, String localName, String qName,Attributes attrs) throws SAXException {
		
	}
	public void characters(char[] ch, int start, int length)throws SAXException {
		
	}
	public void endElement(String uri, String localName, String qName)throws SAXException {
		
	}
	public void endDocument() throws SAXException {
		
	}
}


<!-- 这里开始触发startDocument -->
<?xml version="1.0" encoding="UTF-8"?>
<!-- 每解析一个标签的开始触发startElement -->
<pets>
	<dogs>
		<dog id="1" >			
			<name><!--这里触发character事件-->
<span style="white-space:pre">				</span>YAYA
<span style="white-space:pre">			</span></name>
			<age>100</age>
		</dog>
		<dog id="2">			
			<name>OUOU</name>
			<age>102</age>
		</dog>
	</dogs>
<!-- 解析到闭标签时触发endElement -->
</pets>
<!-- 这里开始触发endDocument -->

2.建立sax解析器思路,设置state为none ,思路可以是当触发startDocument时,建立对象集合。当触发startElement时,判断标签名是不是对象,如果是建立对象,如果不是更改state为name或者age。触发character事件时,如果state是none就return,否则找到相应的state赋值。触发endElement时,判断如果标签名是对象就把对象添加到集合里。

下面开始建立解析器

1)建立petEnumState(不建立也可以,主要为了可读性强)

public enum PetEnumState {
	name,age,none
}

2)建立解析器

package test20141213;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class PetHanlder extends DefaultHandler {
	List<Dog> list=null;
	Dog dog=null;
	//赋标签值状态,如果标签里没有值则为none
	PetEnumState state=PetEnumState.none;
	//通过解析器返回集合
	public List<Dog> getDogs() {
		return this.list;
	}
	public void startDocument() throws SAXException {
		//开始读节点树的时候开始建立对象集合
		list=new ArrayList<Dog> ();
	}
	public void startElement(String uri, String localName, String qName,Attributes attrs) throws SAXException {
		//如果标签名是dog,则创建对象
		if(qName.equals("dog"))
		{
			dog=new Dog();
			return;
		}
		if(qName=="name")
		{
			state=PetEnumState.name;
			return;
		}
		if(qName=="age")
		{
			state=PetEnumState.age;
			return;
		}
	}
	public void characters(char[] ch, int start, int length)throws SAXException {
		//如果状态是none直接退出
		if(state.equals("none"))
			return ;
		String content=new String(ch,start,length);
		//如果有状态则给对象赋值
		switch(state){
			case name:
				dog.setName(content);
				state=PetEnumState.none;
				break;
			case age:
				dog.setAge(Integer.parseInt(content));
				state=PetEnumState.none;
				break;
			default:
			    break;
		}
	}
	//如果读到dog结束标签,则给list添加对象,并且清空dog
	public void endElement(String uri, String localName, String qName)throws SAXException {
		if(qName.equals("dog")){
			list.add(dog);
			dog=null;
		}
	}
	public void endDocument() throws SAXException {
		//没有用到
	}
}

建立测试类

package test20141213;

import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SaxParseTest {
	public static void main(String[] args) {
		SAXParserFactory factory = SAXParserFactory.newInstance(); // 创建SAX解析器工厂
		try {
			SAXParser parser = factory.newSAXParser();
			PetHanlder petHandler = new PetHanlder();
			// URL url = new
			// URL("http://rss.sina.com.cn/news/world/focus15.xml");
			// InputSource is = new InputSource(url.openStream());
			// parser.parse(is, rssHandler); // 开始解析
			// 生成一个具体的SAX解析器
			// local parse
			parser.parse("pet.xml", petHandler); // 开始解析

			List<Dog> dogs = petHandler.getDogs();
			for (Dog dog : dogs) {
				System.out.println(dog);
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值