加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

操作xml

发布时间:2020-12-16 00:19:25 所属栏目:百科 来源:网络整理
导读:转自http://www.cnblogs.com/jiugehuanying/archive/2012/01/12/2320058.html 一、【基础知识——扫盲】 二、【DOM、SAX、JDOM、DOM4j简单使用介绍】 三、【性能测试】 四、【对比】 五、【小插曲XPath】 六、【补充】 关键字:Java解析xml、解析xml四种方法

转自http://www.cnblogs.com/jiugehuanying/archive/2012/01/12/2320058.html

一、【基础知识——扫盲】

二、【DOM、SAX、JDOM、DOM4j简单使用介绍】

三、【性能测试】

四、【对比】

五、【小插曲XPath】

六、【补充】

关键字:Java解析xml、解析xml四种方法、DOM、SAX、JDOM、DOM4j、XPath

【引言】

目前在Java中用于解析XML的技术很多,主流的有DOM、SAX、JDOM、DOM4j,下文主要介绍这4种解析XML文档技术的使用、优缺点及性能测试。

一、【基础知识——扫盲】

sax、dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无法解析xml文档的;jaxp只是api,它进一步封装了sax、dom两种接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默认使用xerces解释器)。

二、【DOM、SAX、JDOM、DOM4j简单使用介绍】

1、【DOM(Document Object Model) 】
由W3C提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。
示例代码:

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <universityname="pku">
  3. <collegename="c1">
  4. <classname="class1">
  5. <studentname="stu1"sex='male'age="21"/>
  6. <studentname="stu2"sex='female'age="20"/>
  7. <studentname="stu3"sex='female'age="20"/>
  8. </class>
  9. <classname="class2">
  10. <studentname="stu4"sex='male'age="19"/>
  11. <studentname="stu5"sex='female'age="20"/>
  12. <studentname="stu6"sex='female'age="21"/>
  13. </class>
  14. </college>
  15. <collegename="c2">
  16. <classname="class3">
  17. <studentname="stu7"sex='male'age="20"/>
  18. </college>
  19. <collegename="c3">
  20. </university>

后文代码中有使用到text.xml(该文档放在src路径下,既编译后在classes路径下),都是指该xml文档。

    packagetest.xml;
  1. importjava.io.File;
  2. importjava.io.FileNotFoundException;
  3. importjava.io.FileOutputStream;
  4. importjava.io.IOException;
  5. importjava.io.InputStream;
  6. importjavax.xml.parsers.DocumentBuilder;
  7. importjavax.xml.parsers.DocumentBuilderFactory;
  8. importjavax.xml.parsers.ParserConfigurationException;
  9. importjavax.xml.transform.Transformer;
  10. importjavax.xml.transform.TransformerConfigurationException;
  11. importjavax.xml.transform.TransformerException;
  12. importjavax.xml.transform.TransformerFactory;
  13. importjavax.xml.transform.dom.DOMSource;
  14. importjavax.xml.transform.stream.StreamResult;
  15. importorg.w3c.dom.Document;
  16. importorg.w3c.dom.Element;
  17. importorg.w3c.dom.Node;
  18. importorg.w3c.dom.NodeList;
  19. importorg.w3c.dom.Text;
  20. importorg.xml.sax.SAXException;
  21. /**
  22. *dom读写xml
  23. *@authorwhwang
  24. */
  25. publicclassTestDom{
  26. staticvoidmain(String[]args){
  27. read();
  28. //write();
  29. }
  30. voidread(){
  31. DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
  32. try{
  33. DocumentBuilderbuilder=dbf.newDocumentBuilder();
  34. InputStreamin=TestDom.class.getClassLoader().getResourceAsStream("test.xml");
  35. Documentdoc=builder.parse(in);
  36. //root<university>
  37. Elementroot=doc.getDocumentElement();
  38. if(root==null)return;
  39. System.err.println(root.getAttribute("name"));
  40. //allcollegenode
  41. NodeListcollegeNodes=root.getChildNodes();
  42. if(collegeNodes==for(inti=0;i<collegeNodes.getLength();i++){
  43. Nodecollege=collegeNodes.item(i);
  44. if(college!=null&&college.getNodeType()==Node.ELEMENT_NODE){
  45. System.err.println("t"+college.getAttributes().getNamedItem("name").getNodeValue());
  46. //allclassnode
  47. NodeListclassNodes=college.getChildNodes();
  48. if(classNodes==continue;
  49. intj=0;j<classNodes.getLength();j++){
  50. Nodeclazz=classNodes.item(j);
  51. if(clazz!=null&&clazz.getNodeType()==Node.ELEMENT_NODE){
  52. System.err.println("tt"+clazz.getAttributes().getNamedItem("name").getNodeValue());
  53. //allstudentnode
  54. NodeListstudentNodes=clazz.getChildNodes();
  55. if(studentNodes==continue;
  56. intk=0;k<studentNodes.getLength();k++){
  57. Nodestudent=studentNodes.item(k);
  58. if(student!=null&&student.getNodeType()==Node.ELEMENT_NODE){
  59. System.err.print("ttt"+student.getAttributes().getNamedItem("name").getNodeValue());
  60. System.err.print(""+student.getAttributes().getNamedItem("sex").getNodeValue());
  61. System.err.println(""+student.getAttributes().getNamedItem("age").getNodeValue());
  62. }
  63. }catch(ParserConfigurationExceptione){
  64. e.printStackTrace();
  65. catch(FileNotFoundExceptione){
  66. catch(SAXExceptione){
  67. catch(IOExceptione){
  68. voidwrite(){
  69. DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
  70. try{
  71. DocumentBuilderbuilder=dbf.newDocumentBuilder();
  72. class.getClassLoader().getResourceAsStream("test.xml");
  73. Documentdoc=builder.parse(in);
  74. //root<university>
  75. Elementroot=doc.getDocumentElement();
  76. return;
  77. //修改属性
  78. root.setAttribute("name","tsu");
  79. NodeListcollegeNodes=root.getChildNodes();
  80. if(collegeNodes!=null){
  81. inti=0;i<collegeNodes.getLength()-1;i++){
  82. //删除节点
  83. if(college.getNodeType()==Node.ELEMENT_NODE){
  84. StringcollegeName=college.getAttributes().getNamedItem("name").getNodeValue();
  85. if("c1".equals(collegeName)||"c2".equals(collegeName)){
  86. root.removeChild(college);
  87. elseif("c3".equals(collegeName)){
  88. ElementnewChild=doc.createElement("class");
  89. newChild.setAttribute("name","c4");
  90. college.appendChild(newChild);
  91. //新增节点
  92. ElementaddCollege=doc.createElement("college");
  93. addCollege.setAttribute("name","c5");
  94. root.appendChild(addCollege);
  95. Texttext=doc.createTextNode("text");
  96. addCollege.appendChild(text);
  97. //将修改后的文档保存到文件
  98. TransformerFactorytransFactory=TransformerFactory.newInstance();
  99. TransformertransFormer=transFactory.newTransformer();
  100. DOMSourcedomSource=newDOMSource(doc);
  101. Filefile=newFile("src/dom-modify.xml");
  102. if(file.exists()){
  103. file.delete();
  104. file.createNewFile();
  105. FileOutputStreamout=newFileOutputStream(file);
  106. StreamResultxmlResult=newStreamResult(out);
  107. transFormer.transform(domSource,xmlResult);
  108. System.out.println(file.getAbsolutePath());
  109. catch(TransformerConfigurationExceptione){
  110. catch(TransformerExceptione){
  111. }

该代码只要稍做修改,即可变得更加简洁,无需一直写if来判断是否有子节点。

2、【SAX (Simple API for XML) 】
SAX不用将整个文档加载到内存,基于事件驱动的API(Observer模式),用户只需要注册自己感兴趣的事件即可。SAX提供EntityResolver,DTDHandler,ContentHandler,ErrorHandler接口,分别用于监听解析实体事件、DTD处理事件、正文处理事件和处理出错事件,与AWT类似,SAX还提供了一个对这4个接口默认的类DefaultHandler(这里的默认实现,其实就是一个空方法),一般只要继承DefaultHandler,重写自己感兴趣的事件即可。
示例代码:

importjava.io.IOException;
  • importjava.io.InputStream;
  • importjavax.xml.parsers.ParserConfigurationException;
  • importjavax.xml.parsers.SAXParser;
  • importjavax.xml.parsers.SAXParserFactory;
  • importorg.xml.sax.Attributes;
  • importorg.xml.sax.InputSource;
  • importorg.xml.sax.Locator;
  • importorg.xml.sax.SAXException;
  • importorg.xml.sax.SAXParseException;
  • importorg.xml.sax.helpers.DefaultHandler;
  • /**
  • *
  • *@authorwhwang
  • */
  • classTestSAX{
  • voidmain(String[]args){
  • read();
  • write();
  • voidread(){
  • SAXParserFactoryfactory=SAXParserFactory.newInstance();
  • SAXParserparser=factory.newSAXParser();
  • InputStreamin=TestSAX.parser.parse(in,newMyHandler());
  • voidwrite(){
  • System.err.println("纯SAX对于写操作无能为力");
  • //重写对自己感兴趣的事件处理方法
  • classMyHandlerextendsDefaultHandler{
  • @Override
  • publicInputSourceresolveEntity(StringpublicId,StringsystemId)
  • throwsIOException,SAXException{
  • returnsuper.resolveEntity(publicId,systemId);
  • voidnotationDecl(Stringname,StringpublicId,153); font-weight:bold; background-color:inherit">throwsSAXException{
  • super.notationDecl(name,publicId,153); font-weight:bold; background-color:inherit">voidunparsedEntityDecl(Stringname,
  • StringsystemId,StringnotationName)super.unparsedEntityDecl(name,systemId,notationName);
  • voidsetDocumentLocator(Locatorlocator){
  • super.setDocumentLocator(locator);
  • @Override
  • voidstartDocument()System.err.println("开始解析文档");
  • voidendDocument()throwsSAXException{
  • System.err.println("解析结束");
  • voidstartPrefixMapping(Stringprefix,Stringuri)
  • super.startPrefixMapping(prefix,uri);
  • voidendPrefixMapping(Stringprefix)super.endPrefixMapping(prefix);
  • voidstartElement(Stringuri,StringlocalName,StringqName,0); font-size:13px; background-color:inherit">Attributesattributes)System.err.print("Element:"+qName+",attr:");
  • print(attributes);
  • voidendElement(Stringuri,StringqName)
  • super.endElement(uri,localName,qName);
  • voidcharacters(char[]ch,153); font-weight:bold; background-color:inherit">intstart,153); font-weight:bold; background-color:inherit">intlength)
  • super.characters(ch,start,length);
  • voidignorableWhitespace(super.ignorableWhitespace(ch,153); font-weight:bold; background-color:inherit">voidprocessingInstruction(Stringtarget,Stringdata)
  • super.processingInstruction(target,data);
  • voidskippedEntity(Stringname)super.skippedEntity(name);
  • voidwarning(SAXParseExceptione)super.warning(e);
  • voiderror(SAXParseExceptione)super.error(e);
  • voidfatalError(SAXParseExceptione)super.fatalError(e);
  • privatevoidprint(Attributesattrs){
  • if(attrs==System.err.print("[");
  • inti=0;i<attrs.getLength();i++){
  • System.err.print(attrs.getQName(i)+"="+attrs.getValue(i));
  • if(i!=attrs.getLength()-1){
  • System.err.print(",");
  • System.err.println("]");
  • 对sax解析的补充

    @Override
    	public List<Person> doParse(InputStream is) {
    		try {
    			//使用同一个对象
    			MyHandler handler = new MyHandler();
    			parser.parse(is,handler);
    			List<Person> persons = handler.getPersons();
    			return persons;
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} 
    		return null;
    	}
    	//开始读取文档时执行 startDocument
    	//读取到<persons>执行startElement方法,然后执行characters方法,执行到</persons>执行endElement然后执行characters方法
    	// 重写对自己感兴趣的事件处理方法   
    	class MyHandler extends DefaultHandler {  
    		private List<Person> persons;
    		private Person person;
    		//保持当前元素名称 为了标示取文档时 取得是哪个节点的文档值
    		private String currentElement;
    		
    		 @Override  
    		    public void startDocument() throws SAXException {  
    		        System.err.println("开始解析文档");  
    		        persons = new ArrayList<Person>();
    		    }  
    		  
    		    @Override  
    		    public void endDocument() throws SAXException {  
    		        System.err.println("解析结束");  
    		    }  
    		    //元素开始时新建对象
    		    @Override  
    		    public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {  
    		    	System.err.print("Element: " + qName + ",attr: ");  
    		    	if("person".equals(localName)){
    		    		person = new Person();
    		    		person.id = Integer.parseInt(attributes.getValue(0));
    		    	}else if("name".equals(localName)){
    		    		this.currentElement = "name";
    		    	}else if("age".equals(localName)){
    		    		this.currentElement = "age";
    		    	}
    		    }  
    		    
    		    //每个元素结束时执行
    		    @Override  
    		    public void endElement(String uri,String qName)  
    		    		throws SAXException {  
    //		        super.endElement(uri,qName);  
    		    	if("person".equals(localName)){
    		    		persons.add(person);
    		    	}
    		    	//置空当前元素。
    		    	this.currentElement = null;
    		    }  
    		    
    		    //字符时间 文档
    		    @Override  
    		    public void characters(char[] ch,int start,int length)  
    		    		throws SAXException {  
    //		        super.characters(ch,length);  
    		    	String str = new String(ch,length);
    		    	if("name".equals(currentElement)){
    		    		person.name = str;
    		    	}else if("age".equals(currentElement)){
    		    		person.age = Integer.parseInt(str);
    		    	}
    		    }  
    		    
    
    	    @Override  
    	    public InputSource resolveEntity(String publicId,String systemId)  
    	            throws IOException,SAXException {  
    	        return super.resolveEntity(publicId,systemId);  
    	    }  
    	  
    	    @Override  
    	    public void notationDecl(String name,String publicId,String systemId)  
    	            throws SAXException {  
    	        super.notationDecl(name,systemId);  
    	    }  
    	  
    	    @Override  
    	    public void unparsedEntityDecl(String name,String systemId,String notationName) throws SAXException {  
    	        super.unparsedEntityDecl(name,notationName);  
    	    }  
    	  
    	    @Override  
    	    public void setDocumentLocator(Locator locator) {  
    	        super.setDocumentLocator(locator);  
    	    }  
    	  
    	    @Override  
    	    public void startPrefixMapping(String prefix,String uri)  
    	            throws SAXException {  
    	        super.startPrefixMapping(prefix,uri);  
    	    }  
    	  
    	    @Override  
    	    public void endPrefixMapping(String prefix) throws SAXException {  
    	        super.endPrefixMapping(prefix);  
    	    }  
    	  
    	    @Override  
    	    public void ignorableWhitespace(char[] ch,int length)  
    	            throws SAXException {  
    	        super.ignorableWhitespace(ch,length);  
    	    }  
    	  
    	    @Override  
    	    public void processingInstruction(String target,String data)  
    	            throws SAXException {  
    	        super.processingInstruction(target,data);  
    	    }  
    	  
    	    @Override  
    	    public void skippedEntity(String name) throws SAXException {  
    	        super.skippedEntity(name);  
    	    }  
    	  
    	    @Override  
    	    public void warning(SAXParseException e) throws SAXException {  
    	        super.warning(e);  
    	    }  
    	  
    	    @Override  
    	    public void error(SAXParseException e) throws SAXException {  
    	        super.error(e);  
    	    }  
    	  
    	    @Override  
    	    public void fatalError(SAXParseException e) throws SAXException {  
    	        super.fatalError(e);  
    	    }  
    	      
    	    public List<Person> getPersons(){
    	    	return persons;
    	    }
    	}  

    3、【JDOM】
    JDOM与DOM非常类似,它是处理XML的纯JAVA API,API大量使用了Collections类,且JDOM仅使用具体类而不使用接口。 JDOM 它自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档(尽管它还可以将以前构造的 DOM 表示作为输入)。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档
    示例代码:

    importjava.io.FileOutputStream;
  • importjava.util.List;
  • importorg.jdom.Attribute;
  • importorg.jdom.Document;
  • importorg.jdom.Element;
  • importorg.jdom.JDOMException;
  • importorg.jdom.input.SAXBuilder;
  • importorg.jdom.output.XMLOutputter;
  • *JDom读写xml
  • classTestJDom{
  • //read();
  • booleanvalidate=false;
  • SAXBuilderbuilder=newSAXBuilder(validate);
  • InputStreamin=TestJDom.Documentdoc=builder.build(in);
  • //获取根节点<university>
  • Elementroot=doc.getRootElement();
  • readNode(root,"");
  • catch(JDOMExceptione){
  • e.printStackTrace();
  • catch(IOExceptione){
  • @SuppressWarnings("unchecked")
  • voidreadNode(Elementroot,Stringprefix){
  • //获取属性
  • List<Attribute>attrs=root.getAttributes();
  • if(attrs!=null&&attrs.size()>0){
  • System.err.print(prefix);
  • for(Attributeattr:attrs){
  • System.err.print(attr.getValue()+"");
  • System.err.println();
  • //获取他的子节点
  • List<Element>childNodes=root.getChildren();
  • prefix+="t";
  • for(Elemente:childNodes){
  • readNode(e,prefix);
  • false;
  • //修改属性
  • "tsu");
  • //删除
  • booleanisRemoved=root.removeChildren("college");
  • System.err.println(isRemoved);
  • //新增
  • ElementnewCollege=newElement("college");
  • newCollege.setAttribute("name","new_college");
  • ElementnewClass=newElement("class");
  • newClass.setAttribute("name","ccccc");
  • newCollege.addContent(newClass);
  • root.addContent(newCollege);
  • XMLOutputterout=newXMLOutputter();
  • newFile("src/jdom-modify.xml");
  • FileOutputStreamfos=out.output(doc,fos);
  • catch(JDOMExceptione){
  • 4、【DOM4j】
    dom4j是目前在xml解析方面是最优秀的(Hibernate、Sun的JAXM也都使用dom4j来解析XML),它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理
    示例代码:

    importjava.io.FileWriter;
  • importorg.dom4j.Attribute;
  • importorg.dom4j.Document;
  • importorg.dom4j.DocumentException;
  • importorg.dom4j.DocumentHelper;
  • importorg.dom4j.Element;
  • importorg.dom4j.ProcessingInstruction;
  • importorg.dom4j.VisitorSupport;
  • importorg.dom4j.io.SAXReader;
  • importorg.dom4j.io.XMLWriter;
  • *Dom4j读写xml
  • classTestDom4j{
  • read1();
  • //read2();
  • //write();
  • voidread1(){
  • SAXReaderreader=newSAXReader();
  • InputStreamin=TestDom4j.Documentdoc=reader.read(in);
  • catch(DocumentExceptione){
  • List<Attribute>attrs=root.attributes();
  • List<Element>childNodes=root.elements();
  • voidread2(){
  • doc.accept(newMyVistor());
  • catch(DocumentExceptione){
  • //创建一个xml文档
  • Documentdoc=DocumentHelper.createDocument();
  • Elementuniversity=doc.addElement("university");
  • university.addAttribute("name",0); background-color:inherit">//注释
  • university.addComment("这个是根节点");
  • Elementcollege=university.addElement("college");
  • college.addAttribute("name","cccccc");
  • college.setText("text");
  • newFile("src/dom4j-modify.xml");
  • XMLWriterout=newXMLWriter(newFileWriter(file));
  • out.write(doc);
  • out.flush();
  • out.close();
  • classMyVistorextendsVisitorSupport{
  • voidvisit(Attributenode){
  • System.out.println("Attibute:"+node.getName()+"="
  • +node.getValue());
  • voidvisit(Elementnode){
  • if(node.isTextOnly()){
  • System.out.println("Element:"+node.getName()+"="
  • +node.getText());
  • else{
  • System.out.println(node.getName());
  • voidvisit(ProcessingInstructionnode){
  • System.out.println("PI:"+node.getTarget()+""+node.getText());
  • 三、【性能测试】

    环境:AMD4400+ 2.0+GHz主频 JDK6.0
    运行参数:-Xms400m -Xmx400m
    xml文件大小:10.7M
    结果:
    DOM: >581297ms
    SAX: 8829ms
    JDOM: 581297ms
    DOM4j: 5309ms
    时间包括IO的,只是进行了简单的测试,仅供参考!!!!

    四、【对比】

    1、【DOM】
    DOM是基于树的结构,通常需要加载整文档和构造DOM树,然后才能开始工作。
    优点:
    a、由于整棵树在内存中,因此可以对xml文档随机访问
    b、可以对xml文档进行修改操作
    c、较sax,dom使用也更简单。
    缺点:
    a、整个文档必须一次性解析完
    a、由于整个文档都需要载入内存,对于大文档成本高
    2、【SAX】
    SAX类似流媒体,它基于事件驱动的,因此无需将整个文档载入内存,使用者只需要监听自己感兴趣的事件即可。
    优点:
    a、无需将整个xml文档载入内存,因此消耗内存少
    b、可以注册多个ContentHandler
    缺点:
    a、不能随机的访问xml中的节点
    b、不能修改文档
    3、【JDOM】
    JDOM是纯Java的处理XML的API,其API中大量使用Collections类,
    优点:
    a、DOM方式的优点
    b、具有SAX的Java规则
    缺点
    a、DOM方式的缺点
    4、【DOM4J】
    这4中xml解析方式中,最优秀的一个,集易用和性能于一身。

    五、【小插曲XPath】

    XPath 是一门在 XML 文档中查找信息的语言, 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。因此,对 XPath 的理解是很多高级 XML 应用的基础。
    XPath非常类似对数据库操作的SQL语言,或者说JQuery,它可以方便开发者抓起文档中需要的东西。(dom4j也支持xpath)
    示例代码:

    importjavax.xml.parsers.DocumentBuilder;
  • importjavax.xml.parsers.DocumentBuilderFactory;
  • importjavax.xml.xpath.XPath;
  • importjavax.xml.xpath.XPathConstants;
  • importjavax.xml.xpath.XPathExpression;
  • importjavax.xml.xpath.XPathExpressionException;
  • importjavax.xml.xpath.XPathFactory;
  • classTestXPath{
  • InputStreamin=TestXPath.XPathFactoryfactory=XPathFactory.newInstance();
  • XPathxpath=factory.newXPath();
  • //选取所有class元素的name属性
  • //XPath语法介绍:http://w3school.com.cn/xpath/
  • XPathExpressionexpr=xpath.compile("//class/@name");
  • NodeListnodes=(NodeList)expr.evaluate(doc,XPathConstants.NODESET);
  • inti=0;i<nodes.getLength();i++){
  • System.out.println("name="+nodes.item(i).getNodeValue());
  • catch(XPathExpressionExceptione){
  • 六、【补充】

    注意4种解析方法对TextNode(文本节点)的处理:

    1、在使用DOM时,调用node.getChildNodes()获取该节点的子节点,文本节点也会被当作一个Node来返回,如:

    importjava.io.FileNotFoundException;
  • importjava.util.Arrays;
  • importorg.w3c.dom.Document;
  • importorg.w3c.dom.Element;
  • importorg.w3c.dom.Node;
  • importorg.w3c.dom.NodeList;
  • classTestDom2{
  • InputStreamin=TestDom2.//System.err.println(root.getAttribute("name"));
  • //allcollegenode
  • System.err.println("university子节点数:"+collegeNodes.getLength());
  • System.err.println("子节点如下:");
  • inti=0;i<collegeNodes.getLength();i++){
  • Nodecollege=collegeNodes.item(i);
  • if(college==System.err.println("t元素节点:"+college.getNodeName());
  • if(college.getNodeType()==Node.TEXT_NODE){
  • System.err.println("t文本节点:"+Arrays.toString(college.getTextContent().getBytes()));
  • 输出的结果是:

    university子节点数:3

  • 子节点如下:
  • 文本节点:[10,9]
  • 元素节点:college
  • 文本节点:[10]
  • 其中n的ASCII码为10,t的ASCII码为9。结果让人大吃一惊,university的子节点数不是1,也不是2,而是3,这3个子节点都是谁呢?为了看得更清楚点,把xml文档改为:

    <universityname="pku">11

  • </college>22
  • 还是上面的程序,输出结果为:

    文本节点:[49,49,10,0); font-size:13px; background-color:inherit">文本节点:[50,50,10]

  • 其中数字1的ASCII码为49,数字2的ASCII码为50。

    2、使用SAX来解析同DOM,当你重写它的public void characters(char[] ch,int length)方法时,你就能看到。

    3、JDOM,调用node.getChildren()只返回子节点,不包括TextNode节点(不管该节点是否有Text信息)。如果要获取该节点的Text信息,可以调用node.getText()方法,该方法返回节点的Text信息,也包括nt等特殊字符。

    4、DOM4j同JDOM

    5、Android中的pull解析

    解析器的对比
    Dom xml文件需要加载2次,而且是整个文档树加载到内存之后才开始解析
    Sax 文档加载一次,基于事件驱动,但会对整个文件进行解析
    Pull 文档加载一次,基于事件驱动,可以对解析到指定的节点,结束解析

    package com.zlz.androidxml.service;
    
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xmlpull.v1.XmlPullParser;
    
    import android.util.Log;
    import android.util.Xml;
    
    import com.zlz.androidxml.domain.Person;
    
    public class PullParseServiceImpl implements ParseService {
    
    	@Override
    	public List<Person> doParse(InputStream is) {
    		List<Person> persons = null;
    		Person person = null;
    		try {
    			XmlPullParser parser = Xml.newPullParser();
    			parser.setInput(is,"utf-8");
    			int eventType = parser.getEventType();
    			//如果文档没有结束,则一直触发 
    			while(eventType != XmlPullParser.END_DOCUMENT){
    				switch(eventType){
    					//文档开始的时候初始化集合
    					case XmlPullParser.START_DOCUMENT:
    						persons = new ArrayList<Person>();
    						break;
    					//标记开始触发事件
    					case XmlPullParser.START_TAG:
    						//如果是<person>则初始化对象
    						String eleName = parser.getName();
    						if("person".equals(eleName)){
    							person = new Person();
    							//获取属性节点
    							int id = Integer.parseInt(parser.getAttributeValue(0));
    							person.id = id;
    						}else if("name".equals(eleName)){
    							person.name = parser.nextText();
    							
    						}else if("age".equals(eleName)){
    							person.age = Integer.parseInt(parser.nextText());
    						}
    						break;
    						//person结束标签时将 对象放入数组
    					case XmlPullParser.END_TAG:
    						if("person".equals(parser.getName())){
    							persons.add(person);
    						}
    						break;
    					default:
    				}
    				//返回事件类型
    				eventType = parser.next();
    			}
    		} catch (Exception e) {
    			Log.i("Other",e.getMessage());
    		}
    		return persons;
    	}
    
    }
    


    参考:

    http://www.docin.com/p-78963650.html

    http://wenku.baidu.com/view/b091f9360b4c2e3f5727638b.html

    http://kree.iteye.com/blog/668280

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读