下载必要的jar包:
activation.jar commons-logging-1.0.4.jar dom4j-1.6.1.jar jaxen-1.1.1.jar jdom-1.0.jar
一、DOM
解析器读入整个文档,然后构建一个驻留内存的树结构,使用 DOM 接口来操作这个树结构。 优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;访问效率高。 缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)
[java] view plain copy package xmlParse; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Calendar; import java.util.Locale; import java.util.TimeZone; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; 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.w3c.dom.DOMException; 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; /** * java自带的dom解析xml文件 * * @author abc * */ public class TestDom { public static void main(String[] args) { builXmlByDom(); parseXmlByDom(); } /** * 生成xml信息 */ public static void builXmlByDom() { long begintime = System.currentTimeMillis(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { //构建Document DocumentBuilder db = dbf.newDocumentBuilder(); Document doc=db.newDocument(); Element root=doc.createElement("students"); root.setAttribute("class", "一班"); root.setAttribute("count", "3"); Element stu=doc.createElement("student"); Element name=doc.createElement("name"); name.appendChild(doc.createTextNode("小明")); Element age=doc.createElement("age"); age.appendChild(doc.createTextNode("10")); stu.appendChild(name); stu.appendChild(age); root.appendChild(stu); stu=doc.createElement("student"); stu.setAttribute("position","班长"); name=doc.createElement("name"); name.appendChild(doc.createTextNode("小王")); age=doc.createElement("age"); age.appendChild(doc.createTextNode("11")); stu.appendChild(name); stu.appendChild(age); root.appendChild(stu); stu=doc.createElement("student"); name=doc.createElement("name"); name.appendChild(doc.createTextNode("小兵")); age=doc.createElement("age"); age.appendChild(doc.createTextNode("12")); stu.appendChild(name); stu.appendChild(age); root.appendChild(stu); doc.appendChild(root); //将被变换的Document对象封装到一个DOMSource对象中 DOMSource xmlSource=new DOMSource(doc); //使用 Transformer对象将一个Document节点变换为一个XML文件 TransformerFactory transFactory=TransformerFactory. newInstance(); Transformer transformer=transFactory.newTransformer(); //创建Result File file=new File("students.xml"); FileOutputStream fos; fos = new FileOutputStream(file); StreamResult result=new StreamResult(fos); transformer.transform(xmlSource, result); if(fos!=null){ fos.close(); } }catch (ParserConfigurationException e) { e.printStackTrace(); }catch (TransformerConfigurationException e) { e.printStackTrace(); }catch (FileNotFoundException e) { e.printStackTrace(); }catch (TransformerException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } System.out.println("dom生成时间(毫秒)" + (System.currentTimeMillis() - begintime)); } /** * 解析xml信息 */ public static void parseXmlByDom() { long begintime = System.currentTimeMillis();; try { DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=dbf.newDocumentBuilder(); File file=new File("students.xml"); Document doc=builder.parse(file); NodeList students=doc.getFirstChild().getChildNodes(); Node student=null; Node node=null; for(int i=0,len=students.getLength();i<len;i++){ student=students.item(i); NodeList childs=student.getChildNodes(); System.out.println("第"+(i+1)+"个学生"); for(int j=0,size=childs.getLength();j<size;j++){ node=childs.item(j); if("name".equals(node.getNodeName())){ System.out.println(node.getNodeName()+"---"+node.getTextContent()); } if("age".equals(node.getNodeName())){ System.out.println(node.getNodeName()+"---"+node.getTextContent()); } } } } catch (DOMException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("dom解析时间(毫秒)" + (System.currentTimeMillis() - begintime)); } } 二、SAX特点: 1、边读边解析,应用于大型XML文档
2、只支持读
3、访问效率低
4、顺序访问
[java] view plain copy package xmlParse; import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class TestSAXParse { /** * @param args */ public static void main(String[] args) { sax(); } public static void sax() { long begintime = System.currentTimeMillis(); File f = new File("students.xml"); SAXParserFactory sf = SAXParserFactory.newInstance(); try { SAXParser sp = sf.newSAXParser(); SAXHandler handler = new SAXHandler(); sp.parse(f, handler); } catch (Exception e) { e.printStackTrace(); } System.out.println("sax解析时间(毫秒)" + (System.currentTimeMillis() - begintime)); } } SAXHandler.java package xmlParse; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import java.util.Stack; public class SAXHandler extends DefaultHandler { Stack tags = null; @Override public void startDocument() throws SAXException { tags=new Stack(); } @Override public void endDocument() throws SAXException { while(!tags.isEmpty()){ System.out.println(tags.peek()); tags.pop(); } tags=null; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("students".equals(qName)){ System.out.println(attributes.getValue("class")+"--人数-"+attributes.getValue("count")); } tags.push(qName);//压入栈 } @Override public void endElement(String uri, String localName, String qName) throws SAXException { tags.pop();//取出栈顶元素 } @Override public void characters(char[] ch, int start, int length) throws SAXException { String tag=(String) tags.peek();//查看栈顶元素,但不移除 if("name".equals(tag)){ System.out.println("name==="+new String(ch,start,length)); } if("age".equals(tag)){ System.out.println("age==="+new String(ch,start,length)); } } }三、JDOM
JDOM 优点:①是基于树的处理XML的Java API,把树加载在内存中 ②没有向下兼容的限制,因此比DOM简单 ③速度快,缺陷少 ④具有SAX的Java规则 缺点:①不能处理大于内存的文档 ②JDOM表示XML文档逻辑模型。不能保证每个字节真正变换。 ③针对实例文档不提供DTD与模式的任何实际模型。 ④不支持与DOM中相应遍历包 最适合于:JDOM具有树的便利,也有SAX的JAVA规则。在需要平衡时使用
[java] view plain copy JDOM package xmlParse; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.jdom.output.XMLOutputter; public class TestJDOM { /** * @param args */ public static void main(String[] args) { buildXmlByJDOM(); parseXmlByJDOM(); } public static String buildXmlByJDOM(){ Document doc=new Document(); Element root=new Element("students"); root.setAttribute("count", "3"); root.setAttribute("class", "一班"); doc.setRootElement(root); root.addContent(new Element("student").addContent(new Element("name").setText("小明")) .addContent(new Element("age").setText("10"))); root.addContent(new Element("student").addContent(new Element("name").setText("小汪")) .addContent(new Element("age").setText("11"))); root.addContent(new Element("student").addContent(new Element("name").setText("小兵")) .addContent(new Element("age").setText("12"))); ByteArrayOutputStream out=new ByteArrayOutputStream(); XMLOutputter putter=new XMLOutputter(); try { putter.output(doc, out); putter.output(doc, new FileOutputStream("students.xml")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return out.toString(); } public static void parseXmlByJDOM(){ long begintime=System.currentTimeMillis(); File f=new File("students.xml"); SAXBuilder builder=new SAXBuilder(); try { Document doc=builder.build(new FileInputStream(f)); Element root=doc.getRootElement(); System.out.println(root.getAttributeValue("class")+"-人数:--"+root.getAttributeValue("count")); List list=root.getChildren("student"); for(int i=0;i<list.size();i++){ Element ele=(Element)list.get(i); System.out.println("第"+(i+1)+"个学生"); System.out.println(ele.getChildText("name")+"---"+ele.getChildText("age")); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("sax解析时间(毫秒)"+(System.currentTimeMillis()-begintime)); } } 四、DOM4J
DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。
[java] view plain copy DOM4J package xmlParse; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class TestDom4J { /** * @param args */ public static void main(String[] args) { buildXmlByDOM4J(); paserXmlByDOM4J(); } public static void buildXmlByDOM4J(){ Document doc=DocumentHelper.createDocument(); doc.setXMLEncoding("UTF-8"); Element root=doc.addElement("students"); root.addAttribute("class", "一班").addAttribute("count", "3"); Element student=root.addElement("student"); student.addElement("name").setText("小明"); student.addElement("age").setText("10"); student=root.addElement("student").addAttribute("position", "班长"); student.addElement("name").setText("小汪"); student.addElement("age").setText("11"); student=root.addElement("student"); student.addElement("name").setText("小兵"); student.addElement("age").setText("12"); String xmlStr=doc.asXML(); try { OutputFormat format=OutputFormat.createPrettyPrint(); XMLWriter writer=new XMLWriter(new FileWriter(new File("students.xml")),format); writer.setEscapeText(false); writer.write(xmlStr); writer.close(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } } public static void paserXmlByDOM4J(){ long begintime=System.currentTimeMillis(); SAXReader reader=new SAXReader(); try { Document doc=reader.read(new FileInputStream(new File("students.xml"))); Element root=doc.getRootElement(); System.out.println(root.attributeValue("class")+"--人数--"+root.attributeValue("count")); /* List<Node> list=root.selectNodes("student");//需要引入jaxen-1.1.1.jar for(int i=0,len=list.size();i<len;i++){ Node node=(Node)list.get(i); System.out.println(node.selectSingleNode("name").getText()+"---"+node.selectSingleNode("age").getStringValue()); }*/ Iterator it=root.elementIterator(); Element ele; while(it.hasNext()){ ele=(Element)it.next(); //System.out.println(ele.selectSingleNode("name").getText()+"---"+ele.selectSingleNode("age").getText()); System.out.println(ele.elementText("name")+"---"+ele.elementText("age")); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } System.out.println("sax解析时间(毫秒)"+(System.currentTimeMillis()-begintime)); } }