java解析XML4种方式(SaxParse/DOM/Jdom/)

解析对象Animal.xml

<?xml version="1.0" encoding="UTF-8"?>
<Animal>
  <Person name="Person1号" iq="82">大家好我是Person1号,我的智商是82</Person>
  <Dog name="狗1号" iq="43">大家好,我是狗1号,我的智商是43</Dog>
  <Person name="Person2号" iq="136">大家好我是Person2号,我的智商是136</Person>
  <Dog name="狗2号" iq="23">大家好,我是狗2号,我的智商是23</Dog>
  <Person name="Person3号" iq="170">大家好我是Person3号,我的智商是170</Person>
  <Dog name="狗3号" iq="50">大家好,我是狗3号,我的智商是50</Dog>
  <Person name="Person4号" iq="207">大家好我是Person4号,我的智商是207</Person>
  <Dog name="狗4号" iq="20">大家好,我是狗4号,我的智商是20</Dog>
  <Person name="Person5号" iq="227">大家好我是Person5号,我的智商是227</Person>
  <Dog name="狗5号" iq="37">大家好,我是狗5号,我的智商是37</Dog>
</Animal>

Javabean

Animal

public class Animal{
	String name;
	int iq;
	String detail;
	public Animal(String name, int iq, String detail) {
		super();
		this.name = name;
		this.iq = iq;
		this.detail = detail;
	}
	@Override
	public String toString() {
		return "Animal [name=" + name + ", iq=" + iq + ", detail=" + detail + "]";
	}
}

person

public class Person extends Animal{
	public Person(String name, int iq, String detail) {
		super(name, iq, detail);
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", iq=" + iq + ", detail=" + detail + "]";
	}
}

dog

public class Dog extends Animal{

	public Dog(String name, int iq, String detail) {
		super(name, iq, detail);
	}
	@Override
	public String toString() {
		return "Dog [name=" + name + ", iq=" + iq + ", detail=" + detail + "]";
	}
}

1.SaxParse解析

import java.io.File;

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

public class SaxParse {
//	Saxparse解析
	public static void saxParse(String path) throws Exception {
//		获得解析器
		SAXParser sp = SAXParserFactory.newInstance().newSAXParser();	
//		解析规则
		MyHandler mh = new MyHandler();
//		解析
		sp.parse(new File(path),mh);
		
		for (Animal am : mh.list) {
			System.out.println(am.toString());
		}
	}
	
}

自定义解析规则 Myhandler mh

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 MyHandler extends DefaultHandler{
	List<Animal>list = new ArrayList<>();
	Animal am;
	//获取xml节点属性值
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		//判断是person还是dog,qName即表示元素节点值
		if("Person".equals(qName)) {
			//attributes表示person属性值,getValue("name")表示获取属性名为name的value
			am = new Person(attributes.getValue("name"), Integer.parseInt(attributes.getValue("iq")), null);
			list.add(am);
		}else if("Dog".equals(qName)) {
			am = new Dog(attributes.getValue("name"), Integer.parseInt(attributes.getValue("iq")),null);
			list.add(am);	
		}
	}
	//获取节点中间value,即<Person>value</Person>
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		if(am!=null) {
			//获取内容并去除首尾空格
			am.detail = new String(ch, start, length).trim();
			am = null;
		}
	}
}

解析结果

public class Test {
	public static String path = "src/Animal.xml";
	public static void main(String[] args) throws Exception {
		
		SaxParse.saxParse(path);
	}
}

java解析XML4种方式(SaxParse/DOM/Jdom/)

2.DOM解析

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

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/*dom和sax的对比:
 *效率:sax>dom
 *用起来顺手:dom>sax
 *工作中用dom用的高
 */
public class DomParse {
	static List<Animal>list = new ArrayList<>();
	static Animal am;
	public static void main(String[] args)throws Exception {
		domParse("src/Animal.xml");
	}
//	dom解析
	public static void domParse(String path) throws Exception {
		//获取工厂并获取解析器
		DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		//解析
		Document doc = db.parse(new File(path));
		//根据标签名获取元素列表
		NodeList p = doc.getElementsByTagName("Person");
		NodeList d = doc.getElementsByTagName("Dog");
		//遍历Node
		for (int i = 0; i < p.getLength(); i++) {
			Element ele = (Element) p.item(i);
			am = new Person(ele.getAttribute("name"), Integer.parseInt(ele.getAttribute("iq")), ele.getTextContent());
			list.add(am);
		}
		for (int i = 0; i < d.getLength(); i++) {
			Element ele = (Element) d.item(i);
			am = new Dog(ele.getAttribute("name"), Integer.parseInt(ele.getAttribute("iq")), ele.getTextContent());
			list.add(am);
		}
		//输出
		for (Animal animal : list) {
			System.out.println(animal.toString());
		}
	}
}

解析结果

java解析XML4种方式(SaxParse/DOM/Jdom/)

3.Jdom解析

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

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

public class JdomParse {
	public static void main(String[] args)throws Exception {
		jdomParse("src/Animal.xml");
	}
	/*Jdom:是外部提供的用于xml相关操作的工具
	 * 写入xml方便
	 */
	//解析xml
	public static void jdomParse(String path) throws Exception {
		//建立解析器
		SAXBuilder sb = new SAXBuilder();
		Document doc = sb.build(new File(path));
		//获取根标签
		Element root = doc.getRootElement();
		//获取所有子标签的集合
		List<Element>list = root.getChildren();
		List<Animal> ams = new ArrayList<>();
		for (Element element : list) {
			//根据子标签名字匹配javabean,element.getAttributeValue获取属性
			if("Person".equals(element.getName())) {
				ams.add(new Person(element.getAttributeValue("name"), Integer.parseInt(element.getAttributeValue("iq")), element.getText()));
			}else if("Dog".equals(element.getName())) {
				ams.add(new Dog(element.getAttributeValue("name"), Integer.parseInt(element.getAttributeValue("iq")), element.getText()));
			}
		}
		//输出
		for (Animal animal : ams) {
			System.out.println(animal.toString());
		}
	}
}

解析结果

java解析XML4种方式(SaxParse/DOM/Jdom/)

4.jdk自带的解析xml的方式:
    JAXBContext
    注解
    
1.创建一个xml配置文件
2.定义一个java bean  用于映射xml配置文件
    每个节点都需要定义一个bean 与之关联
        BeanDefinition >> <bean>
        
3.在配置类的类上和属性的get方法上添加相应的注解:
    
    类上:
        @XmlRootElement
    get方法上
        @XmlAttribute
        
    作为子节点的属性:
        @XmlElement
    
    通过注解中的name属性, 将xml中的标签名和属性名和java bean中的属性关联起来
        
4.解析xml
    通过JAXBContext来解析xml

 

具体通过实现spring ioc(控制反转)讲解