xml的四种解析方式:
1. 以DOM方式解析。优点是可以对文档的内容和结构进行修改,但不适合大文件的读取。
2. 以SAX方式解析。SAX模型最大的优点是内存消耗小,因为整个文档无需一次加载到内存中,这使SAX解析器可以解析大于系统内存的文档。缺点是不能修改文档。
3. 通过JDOM组件。可以认为JDOM=DOM+SAX,折合了两种的优点。
4. 通过DOM4j组件。跟JDOM类似,某些时候由于JDOM,常见于一些开源框架中。
使用案例:
1.读取文档
<span style="font-size: small;" mce_style="font-size: small;">package com.ljp.xml; import java.io.File; import java.io.IOException; 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.NodeList; import org.xml.sax.SAXException; public class DOMDemo{ public static void main(String[] args) { //取得DocmentBuilderFactory对象 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //取得DocumentBuilder对象 DocumentBuilder builder=null; try { builder=factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } //取得Document对象 Document doc=null; try { doc=builder.parse(new File("DOMDemo.xml")); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } NodeList nl=doc.getElementsByTagName("man"); for(int i=0;i<nl.getLength();i++){ Element e=(Element) nl.item(i); System.out.println(e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()); System.out.println(e.getElementsByTagName("age").item(0).getFirstChild().getNodeValue()); } } } </span>
2.写入xml文档
<span style="font-size: small;" mce_style="font-size: small;">package com.ljp.xml; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; 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.Document; import org.w3c.dom.Element; public class GenerateXMLDemo { public static void main(String[] args) { // TODO Auto-generated method stub DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=null; try { builder=factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } Document doc=null; doc=builder.newDocument(); //建立各个操作节点 Element mans=doc.createElement("mans"); Element man=doc.createElement("man"); Element name=doc.createElement("name"); Element age=doc.createElement("age"); //为节点添加内容 name.appendChild(doc.createTextNode("罗军平")); age.appendChild(doc.createTextNode("22")); //设置节点关系 man.appendChild(name); man.appendChild(age); mans.appendChild(man); doc.appendChild(mans); //输出到文档文件中中 TransformerFactory tfactory=TransformerFactory.newInstance(); Transformer tf=null; try { tf=tfactory.newTransformer(); } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } //tf.setOutputProperty(OutputKeys.ENCODING,"GBK");//设置编码 DOMSource source=new DOMSource(doc); StreamResult result=new StreamResult(new File("GenerateXMLDemo.xml")); try { tf.transform(source, result); } catch (TransformerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } </span>
SAX的一个特点是用户可以自定义的输出内容的格式,此功能的实现要求用户用户设计一个类,此类需继承DefaultHandler,并复写相关方法,如下面的MySAX类
使用案例:
1.读取xml文档:
MySAX.java
<span style="font-size: small;" mce_style="font-size: small;">package com.ljp.xml; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MySAX extends DefaultHandler { public void startDocument() throws SAXException{ System.out.print("<?xml version=/"1.0/" encoding=/"GBK/"?>"); } public void startElement(String uri,String localName, String qName,Attributes arributes)throws SAXException{ System.out.print("<"); System.out.print(qName); System.out.print(">"); } public void characters(char[] ch,int start,int length) throws SAXException{ System.out.print(new String(ch,start,length)); } public void endElement(String uri,String localName, String qName)throws SAXException{ System.out.print("<"); System.out.print(qName); System.out.print(">"); } public void endDocument() throws SAXException{ System.out.print("文档结束。。。。"); } } </span>
SAXDemo.java
<span style="font-size: small;" mce_style="font-size: small;">package com.ljp.xml; import java.io.File; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class SAXDemo { public static void main(String args[]){ SAXParserFactory factory=SAXParserFactory.newInstance(); SAXParser parser=null; try { parser = factory.newSAXParser(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { parser.parse(new File("SAXDemo.xml"),new MySAX()); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } </span>
四. JDOM
使用案例:
1.读取xml文档
JDOMParseDemo.java
<span style="font-size: small;" mce_style="font-size: small;">package com.ljp.xml; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; public class JDOMParseDemo { public static void main(String[] args) { SAXBuilder builder=new SAXBuilder(); Document doc=null; try { doc=builder.build(new File("JDOMWriteDemo.xml")); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //得到跟节点 Element root=doc.getRootElement(); List list=root.getChildren(); Iterator iter=list.iterator(); while(iter.hasNext()){ Element e=(Element) iter.next(); String name=e.getChildText("name"); String id=e.getChild("name").getAttributeValue("id"); String age=e.getChildText("age"); System.out.print(name+" "+id+" "+age); } } } </span>
2.创建xml文档
JDOMWriteDemo .java
<span style="font-size: small;" mce_style="font-size: small;">package com.ljp.xml; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.jdom.Attribute; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.XMLOutputter; public class JDOMWriteDemo { public static void main(String[] args) { // TODO Auto-generated method stub Document doc=new Document(); Element mans=new Element("mans"); Element man=new Element("man"); Element name=new Element("name"); Element age=new Element("age"); Attribute id=new Attribute("id","罗军平"); //增加内容 name.setText("罗军平"); age.setText("22"); name.setAttribute(id); //设置联系 doc.addContent(mans); mans.addContent(man); man.addContent(name); man.addContent(age); //输出到文件 XMLOutputter out=new XMLOutputter(); try { out.setFormat(out.getFormat().setEncoding("GBK")); //设置编码 out.output(doc,new FileOutputStream(new File("JDOMWriteDemo.xml"))); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } </span>
五. DOM4j
使用案例:
1.读取xml文档
DOM4jReaderDemo.java
<span style="font-size: small;" mce_style="font-size: small;">package com.ljp.xml; import java.io.File; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class DOM4jReaderDemo { /** * @param args */ public static void main(String[] args) { SAXReader reader=new SAXReader(); Document doc=null; try { doc=reader.read(new File("DOM4jWriteDemo.xml")); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } Element root=doc.getRootElement(); Iterator iter=root.elementIterator("man"); while(iter.hasNext()){ Element man=(Element) iter.next(); System.out.println(man.elementText("name")); System.out.println(man.elementText("age")); } } } </span>
2.创建xml文档
DOM4jWriteDemo.java
<span style="font-size: small;" mce_style="font-size: small;">package com.ljp.xml; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; public class DOM4jWriteDemo { @SuppressWarnings("deprecation") public static void main(String[] args) { Document doc=DocumentHelper.createDocument(); //定义一个根节点 Element root=doc.addElement("mans"); Element man=root.addElement("man"); Element name=man.addElement("name"); Element age=man.addElement("age"); name.setText("Tom"); //name.setAttributeValue("id", "luo"); //已过时 name.addAttribute("id", "20091205"); age.setText("22"); OutputFormat format=OutputFormat.createPrettyPrint(); format.setEncoding("GBK"); XMLWriter writer=null; try { writer=new XMLWriter(new FileOutputStream(new File("DOM4jWriteDemo.xml")),format); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { writer.write(doc); writer.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } </span>