dom,sax解析xml

来源:互联网 发布:linux centos6.5下载 编辑:程序博客网 时间:2024/04/27 08:45

person.xml

<?xml version="1.0" ?><persons><person name="奥巴马"><age>99</age><address>美国</address></person><person name="习大大"><age>55</age><address>中国</address></person></persons>

person类

package com.aceona.xml;import java.io.Serializable;public class Person implements Serializable {/** *  */private static final long serialVersionUID = 1L;private String name;private int age;private String address;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;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + ", address=" + address+ "]";}}



dom解析

package com.aceona.xml;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.Node;import org.w3c.dom.NodeList;public class ParseXml {/** * 采用DOM解析时具体处理步骤是:   1 首先利用DocumentBuilderFactory创建一个DocumentBuilderFactory实例   2 然后利用DocumentBuilderFactory创建DocumentBuilder   3 然后加载XML文档(Document),   4 然后获取文档的根结点(Element),   5 然后获取根结点中所有子节点的列表(NodeList),   6 然后使用再获取子节点列表中的需要读取的结点。           当然我们观察节点,我需要用一个对象来保存数据,抽象出对象类 * @param xmlName * @return * @throws Exception */public static List<Person> getPersonByDOM(String xmlName) throws Exception{List<Person> list = new ArrayList<Person>();//首先利用DocumentBuilderFactory创建一个DocumentBuilderFactory实例DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//然后利用DocumentBuilderFactory创建DocumentBuilderDocumentBuilder builder = factory.newDocumentBuilder();//然后加载XML文档(Document)Document document = builder.parse(new File(xmlName));//然后获取文档的根结点(Element)Element element =  document.getDocumentElement();//然后获取根结点中所有子节点的列表(NodeList)NodeList nodes = element.getElementsByTagName("person");System.out.println("nodes length:"+nodes.getLength());Person  person = null;for (int i = 0; i < nodes.getLength(); i++) {person = new Person();Element personElement = (Element)(nodes.item(i));person.setName(personElement.getAttribute("name"));NodeList personNodes = personElement.getChildNodes();for (int j = 0; j < personNodes.getLength(); j++) {if (personNodes.item(j).getNodeType()==Node.ELEMENT_NODE) {if ("age".equals(personNodes.item(j).getNodeName())) {person.setAge(Integer.parseInt(personNodes.item(j).getFirstChild().getNodeValue()));}if ("address".equals(personNodes.item(j).getNodeName())) {person.setAddress(personNodes.item(j).getFirstChild().getNodeValue());}}}list.add(person);}return list;}public static void main(String[] args) throws Exception {List<Person> list = getPersonByDOM("person.xml");if (list.size()>0&&null!=list) {for (Person person : list) {System.out.println(person.toString());}}}}

SAX解析

package com.aceona.xml;import java.io.FileReader;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;public class PersonHandler extends DefaultHandler {private List<Person> list;private Person person;private String tag = null;@Overridepublic void startDocument() throws SAXException {System.out.println("startDocument----------------开始解析--------------");list = new ArrayList<Person>();}@Overridepublic void endDocument() throws SAXException {System.out.println("endDocument----------------结束解析-------------");}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {System.out.println("----------------startElement--------------");System.out.println("uri:"+uri+",localName:"+localName+",qName:"+qName);if("person".equals(qName)){person = new Person();person.setName(attributes.getValue("name"));System.out.println("attributes.getValue():"+attributes.getValue("name"));}tag = qName;//把解析到的节点赋给tag}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {System.out.println("---------------endElement--------------");System.out.println("uri:"+uri+",localName:"+localName+",qName:"+qName);if("person".equals(qName)){list.add(person);person = null;}tag = null;}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {System.out.println("--------------characters----------------");if(tag!=null&&!tag.equals("")){String content = new String(ch, start, length);System.err.println("content:"+content);if("age".equals(tag)){person.setAge(Integer.valueOf(content));}if("address".equals(tag)){person.setAddress(content);}}}public List<Person> getPersons(){return list;}/** * 采用SAX解析时具体处理步骤是:1 创建SAXParserFactory对象2 根据SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器3 根据SAXParser解析器获取事件源对象XMLReader4 实例化一个DefaultHandler对象5 连接事件源对象XMLReader到事件处理类DefaultHandler中6 调用XMLReader的parse方法从输入源中获取到的xml数据7 通过DefaultHandler返回我们需要的数据集合。 * @param xmlName * @return * @throws SAXException  * @throws Exception  * @throws Exception */public static List<Person> getPersonBySAX(String xmlName) throws Exception{//1 创建SAXParserFactory对象SAXParserFactory factory = SAXParserFactory.newInstance();//2 根据SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器SAXParser saxParser = factory.newSAXParser();//3 根据SAXParser解析器获取事件源对象XMLReaderXMLReader xmlReader = saxParser.getXMLReader();//4 实例化一个DefaultHandler对象PersonHandler handler = new PersonHandler();//5 连接事件源对象XMLReader到事件处理类DefaultHandler中xmlReader.setContentHandler(handler);//6 调用XMLReader的parse方法从输入源中获取到的xml数据xmlReader.parse(new InputSource(new FileReader("person.xml")));return handler.getPersons();}public static void main(String[] args) throws Exception {List<Person> list = getPersonBySAX("person.xml");if (list.size()>0&&null!=list) {for (Person person : list) {System.out.println(person.toString());}}}}