xml解析技术漫谈
xml有哪些解析技术?区别是什么?
DOM:
处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问。
下面给出一个DOM解析xml文件的例子。
package parse.impl;import java.io.InputStream;import java.util.ArrayList;import java.util.List;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;import parse.ParseXml;import vo.Person;public class DomXml implements ParseXml{public List<Person> getPersons(InputStream inputStream) throws Exception {List<Person> persons = new ArrayList<Person>();Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream);Element element = document.getDocumentElement();/** * 获取person标签 */NodeList personNodes = element.getElementsByTagName("person");/** * 逐个处理person */for(int i=0;i<personNodes.getLength();i++){Element personElement = (Element)personNodes.item(i);Person person = new Person();//取出idperson.setIdCard(Integer.parseInt(personElement.getAttribute("idCard")));//person的子节点NodeList childNodes = personElement.getChildNodes();//逐个处理子节点for(int j=0;j<childNodes.getLength();j++){System.out.println("节点"+j+":"+childNodes.item(j).getNodeName());//判断是否是元素节点if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){//判断子节点名称if("name".equals(childNodes.item(j).getNodeName())){person.setName(childNodes.item(j).getFirstChild().getNodeValue());}else if("age".equals(childNodes.item(j).getNodeName())){person.setAge(Integer.parseInt(childNodes.item(j).getFirstChild().getNodeValue()));}else if("sex".equals(childNodes.item(j).getNodeName())){person.setSex(childNodes.item(j).getFirstChild().getNodeValue());}}}persons.add(person);}return persons;}}
节点0:#text节点1:name节点2:#text节点3:age节点4:#text节点5:sex节点6:#text节点0:#text节点1:name节点2:#text节点3:age节点4:#text节点5:sex节点6:#textidcard:1001,name:周健儿,age:52,sex:女
package parse.impl;import java.io.InputStream;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.SAXException;import org.xml.sax.helpers.DefaultHandler;import parse.ParseXml;import vo.Person;public class SaxXml extends DefaultHandler implements ParseXml {List<Person> persons = new ArrayList<Person>();protected void init(InputStream inputStream){try{SAXParserFactory spFactory = SAXParserFactory.newInstance();SAXParser parser = spFactory.newSAXParser();parser.parse(inputStream, new SaxXml());}catch(Exception e){e.printStackTrace();}}public List<Person> getPersons(InputStream inputStream) throws Exception {init(inputStream);return persons;}@Overridepublic void endDocument() throws SAXException {System.out.println("解析完毕");}@Overridepublic void skippedEntity(String name) throws SAXException {System.out.println("这个在哪里"+name);}/** * 开始标记调用 */@Overridepublic void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {for(int i=0;i<attributes.getLength();i++){System.out.println("节点属性名称:"+attributes.getQName(i));System.out.println("节点属性值:"+attributes.getValue(i));}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {System.out.println("节点数据:"+new String(ch,start,length));}/** * 文件打开时调用该方法 */@Overridepublic void startDocument() throws SAXException {System.out.println("开始解析xml文档");}}
开始解析xml文档