xml四种解析方式
1 import java.io.File; 2 import java.util.List; 3 4 import org.dom4j.Attribute; 5 import org.dom4j.Document; 6 import org.dom4j.DocumentException; 7 import org.dom4j.Element; 8 import org.dom4j.io.SAXReader; 9 10 11 /** 12 * dom4j is an easy to use, open source library for working with XML, XPath and XSLT 13 * on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP. 14 * @author mulberries 15 * 16 */ 17 18 public class Dom4jParseXml { 19 public static void main(String[] args) throws DocumentException { 20 SAXReader saxReader=new SAXReader(); 21 Document document=saxReader.read(new File("c:"+File.separator+"test.txt")); 22 /** 23 * 遍历所有节点以及节点下的属性 24 */ 25 Element rootElement=document.getRootElement(); 26 Dom4jParseXml dom4jParseXml=new Dom4jParseXml(); 27 dom4jParseXml.listNodes(rootElement); 28 } 29 30 /** 31 * 列出所有的节点 32 * @param element 33 */ 34 public void listNodes(Element element){ 35 @SuppressWarnings("unchecked") 36 List<Element> elements=element.elements(); 37 //没有子元素 38 if(elements.size()==0){ 39 System.out.print(element.getPath()); 40 Dom4jParseXml dom4jParseXml=new Dom4jParseXml(); 41 dom4jParseXml.listAttribute(element); 42 System.out.println(); 43 }else{ 44 for(int i=0;i<elements.size();i++){ 45 listNodes(elements.get(i)); 46 } 47 } 48 } 49 /** 50 * 列出节点下的所有属性 51 * @param element 52 */ 53 public void listAttribute(Element element){ 54 @SuppressWarnings("unchecked") 55 List<Attribute> attributes=element.attributes(); 56 if(attributes.size()==0) 57 return ; 58 else { 59 for(int i=0;i<attributes.size();i++){ 60 System.out.print(" "+attributes.get(i).getName()+" "+attributes.get(i).getValue()); 61 62 } 63 } 64 65 } 66 }
1 import java.io.File; 2 import java.io.IOException; 3 4 import javax.xml.parsers.DocumentBuilder; 5 import javax.xml.parsers.DocumentBuilderFactory; 6 import javax.xml.parsers.ParserConfigurationException; 7 8 import org.w3c.dom.Document; 9 import org.w3c.dom.Element; 10 import org.w3c.dom.NamedNodeMap; 11 import org.w3c.dom.Node; 12 import org.w3c.dom.NodeList; 13 import org.xml.sax.SAXException; 14 15 16 /** 17 * dom解析 18 * 将xml内容一次性全部载入,组成一个树,然后读取各个节点的信息 19 * 在小型xml文档中较为出色,但对于大型xml文档,由于每次都要全部载入,所以相对比较消耗 20 21 * 22 */ 23 public class DomParseXml { 24 public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { 25 DomParseXml domParseXml=new DomParseXml(); 26 DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance(); 27 DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder(); 28 Document document=documentBuilder.parse("c:"+File.separator+"test.txt"); 29 //获取根节点 30 Element rootElement=document.getDocumentElement(); 31 NodeList nodeList=rootElement.getChildNodes(); 32 for(int i=0;i<nodeList.getLength();i++){ 33 /* 34 * dom解析xml文档时,会涵盖空格等节点,#text的字段常量值为3(TEXT_NODE) 35 */ 36 if(nodeList.item(i).getNodeType()!=Node.TEXT_NODE){ 37 System.out.println(nodeList.item(i).getNodeName()); 38 domParseXml.listNode(nodeList.item(i)); 39 System.out.println(nodeList.item(i).getNodeName()); 40 41 } 42 } 43 44 } 45 46 public void listNode(Node node){ 47 NodeList nodeList=node.getChildNodes(); 48 if(nodeList.getLength()==0){ 49 if(node.getNodeType()!=Node.TEXT_NODE){ 50 System.out.print(node.getNodeName()+" "); 51 listAttr(node); 52 53 } 54 }else{ 55 for(int i=0;i<nodeList.getLength();i++) 56 listNode(nodeList.item(i)); 57 } 58 } 59 60 public void listAttr(Node node){ 61 NamedNodeMap namedNodeMap= node.getAttributes(); 62 if(null!=namedNodeMap&&namedNodeMap.getLength()!=0){ 63 for(int i=0;i<namedNodeMap.getLength();i++){ 64 System.out.println(namedNodeMap.item(i).getNodeName()+" "+namedNodeMap.item(i).getNodeValue()); 65 } 66 } 67 } 68 69 }
1 import java.io.File; 2 import java.io.IOException; 3 4 import javax.xml.parsers.ParserConfigurationException; 5 import javax.xml.parsers.SAXParser; 6 import javax.xml.parsers.SAXParserFactory; 7 8 import org.xml.sax.Attributes; 9 import org.xml.sax.SAXException; 10 import org.xml.sax.helpers.DefaultHandler; 11 12 /** 13 * 以事件方式驱动解析过程,相对性能比较高,但是在解析的过程中不会保留结构信息 14 * 但是注意,在sax解析过程中,空白节点也会作为事件而驱动处理器 15 * @author Administrator 16 * 17 */ 18 19 20 public class SaxHandle extends DefaultHandler { 21 22 private String previousString=null; 23 public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException { 24 SAXParserFactory saxParserFactory=SAXParserFactory.newInstance(); 25 SAXParser saxParser=saxParserFactory.newSAXParser(); 26 File file=new File("c:"+File.separator+"test.txt"); 27 saxParser.parse(file, new SaxHandle()); 28 29 } 30 @Override 31 public void startDocument() throws SAXException { 32 System.out.println("解析开始"); 33 34 } 35 36 @Override 37 public void endDocument() throws SAXException { 38 System.out.println("解析结束"); 39 } 40 41 public void startElement(String uri, String localName, String qName, 42 Attributes attributes) throws SAXException { 43 44 previousString=qName; 45 for(int i=0;i<attributes.getLength();i++){ 46 47 System.out.println(attributes.getQName(i)+" "+attributes.getValue(i)); 48 } 49 50 } 51 52 @Override 53 public void endElement(String uri, String localName, String qName) 54 throws SAXException { 55 } 56 57 @Override 58 public void characters(char[] ch, int start, int length) 59 throws SAXException { 60 if (previousString!=null) { 61 if(previousString.equals("name")||previousString.equals("sex")){ 62 System.out.println(new String(ch,start,length)); 63 previousString=null; 64 } 65 } 66 67 } 68 69 }