java解析与生成xml(三): JDOM

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。
作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui0317/article/details/12137845

一、前言

    JDom是一套非常优秀的Java开源api,主要用于读写xml文档,具有性能优异、功能强大、和非常方便使用的特点,并且把jdk自带的解析方式SAX和Dom的功能有效地结合起来。经过实践操作发现dom4j和jdom解析xml的时候有一些相似的地方,故可以比对一下解析的性能和实现方式的效率。


二、准备条件

   jdom.jar

下载地址:http://download.csdn.net/detail/ch656409110/6334543


三、使用JDom实战


1、解析xml文档

实现思路:

   <1>创建SAX创建者对象的实例;

   <2>根据读取的xml路径,传递给SAXBuilder的实例之后 返回一个Document文档对象;

   <3>然后操作这个Document对象,获取下面的节点以及子节点的信息。

具体代码如下:

  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileNotFoundException;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.OutputStream;  
  8. import java.util.List;  
  9.   
  10. import org.jdom.DocType;  
  11. import org.jdom.Document;  
  12. import org.jdom.Element;  
  13. import org.jdom.JDOMException;  
  14. import org.jdom.input.SAXBuilder;  
  15. import org.jdom.output.XMLOutputter;  
  16. import org.xml.sax.InputSource;  
  17.   
  18.   
  19. /** 
  20.  * 使用JDom操作xml的简单例子 
  21.  * @author Administrator 
  22.  * 
  23.  */  
  24. public class JDomOperateXmlDemo {  
  25.   
  26.     public void parseXml01(){  
  27.         String xmlPath = "D:\\project\\dynamicWeb\\src\\resource\\document01.xml";    
  28.         String xmlName = xmlPath.substring(xmlPath.lastIndexOf("\\"));   
  29.         try {  
  30.             //创建SAX建造者对象,该类构造方法的重载boolean类型的方法中validate表示是否验证xml文档。  
  31.             SAXBuilder saxBuilder = new SAXBuilder(false);  
  32.             //1、直接指定绝对路径获取文件输入流对象  
  33.             //InputStream inputStream = new FileInputStream(xmlPath);  
  34.             //2、使用类的相对路径查找xml路径  
  35.             //InputStream inputStream = this.getClass().getResourceAsStream(xmlName);  
  36.             //3、也可以指定路径完成InputStream输入流的实例化操作    
  37.             InputStream inputStream = new FileInputStream(new File(xmlPath));    
  38.             //4、使用InputSource输入源作为参数也可以转换xml    
  39.             InputSource inputSource = new InputSource(inputStream);  
  40.             //解析xml文档,返回document文档对象  
  41.             Document document = saxBuilder.build(inputSource);  
  42.             Element rootElement = document.getRootElement();//根节点  
  43.               
  44.             System.out.println("根节点名称:" + rootElement.getName());//获取节点的名称    
  45.             System.out.println("根节点有多少属性:" + rootElement.getAttributes().size());//获取节点属性数目    
  46.             System.out.println("根节点id属性的值:" + rootElement.getAttributeValue("id"));//获取节点的属性id的值    
  47.             System.out.println("根节点内文本:" + rootElement.getText());//如果元素有子节点则返回空字符串,否则返回节点内的文本    
  48.             //rootElement.getText() 之所以会换行是因为 标签与标签之间使用了tab键和换行符布局,这个也算是文本所以显示出来换行的效果。    
  49.             System.out.println("根节点内文本(1):" + rootElement.getTextTrim());//去掉的是标签与标签之间的tab键和换行符等等,不是内容前后的空格  
  50.             System.out.println("根节点内文本(2):" + rootElement.getTextNormalize()); //目前发现和getTextTrim()方法效果一样     
  51.             System.out.println("根节点内文本(3):" + rootElement.getValue());  //返回节点下所有内容  
  52.     
  53.             Element element = rootElement.getChild("Element"); //获取子节点,如果有多个Element节点,那么返回最先读取到的element  
  54.             if(element != null){    
  55.                 System.out.println("子节点的文本:" + element.getText());//因为子节点和根节点都是Element对象所以它们的操作方式都是相同的    
  56.             }   
  57.             //但是有些情况xml比较复杂,规范不统一,某个节点不存在直接java.lang.NullPointerException,所以获取到element对象之后要先判断一下是否为空    
  58.             List<Element> list = rootElement.getChildren("Element");//返回的是List集合  
  59.             for (Element ele : list) {  
  60.             }             
  61.         } catch (JDOMException e) {  
  62.             e.printStackTrace();  
  63.         } catch (IOException e) {  
  64.             e.printStackTrace();  
  65.         }  
  66.     }  
  67.       
  68.     public static void main(String[] args) {  
  69.         JDomOperateXmlDemo demo = new JDomOperateXmlDemo();  
  70.         demo.parseXml01();  
  71.     }  
  72. }  
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.jdom.DocType;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import org.xml.sax.InputSource;


/**
 * 使用JDom操作xml的简单例子
 * @author Administrator
 *
 */
public class JDomOperateXmlDemo {

	public void parseXml01(){
        String xmlPath = "D:\\project\\dynamicWeb\\src\\resource\\document01.xml";  
        String xmlName = xmlPath.substring(xmlPath.lastIndexOf("\\")); 
		try {
			//创建SAX建造者对象,该类构造方法的重载boolean类型的方法中validate表示是否验证xml文档。
			SAXBuilder saxBuilder = new SAXBuilder(false);
			//1、直接指定绝对路径获取文件输入流对象
			//InputStream inputStream = new FileInputStream(xmlPath);
			//2、使用类的相对路径查找xml路径
			//InputStream inputStream = this.getClass().getResourceAsStream(xmlName);
			//3、也可以指定路径完成InputStream输入流的实例化操作  
            InputStream inputStream = new FileInputStream(new File(xmlPath));  
            //4、使用InputSource输入源作为参数也可以转换xml  
            InputSource inputSource = new InputSource(inputStream);
            //解析xml文档,返回document文档对象
            Document document = saxBuilder.build(inputSource);
			Element rootElement = document.getRootElement();//根节点
			
			System.out.println("根节点名称:" + rootElement.getName());//获取节点的名称  
            System.out.println("根节点有多少属性:" + rootElement.getAttributes().size());//获取节点属性数目  
            System.out.println("根节点id属性的值:" + rootElement.getAttributeValue("id"));//获取节点的属性id的值  
            System.out.println("根节点内文本:" + rootElement.getText());//如果元素有子节点则返回空字符串,否则返回节点内的文本  
            //rootElement.getText() 之所以会换行是因为 标签与标签之间使用了tab键和换行符布局,这个也算是文本所以显示出来换行的效果。  
            System.out.println("根节点内文本(1):" + rootElement.getTextTrim());//去掉的是标签与标签之间的tab键和换行符等等,不是内容前后的空格
            System.out.println("根节点内文本(2):" + rootElement.getTextNormalize()); //目前发现和getTextTrim()方法效果一样   
            System.out.println("根节点内文本(3):" + rootElement.getValue());  //返回节点下所有内容
  
            Element element = rootElement.getChild("Element"); //获取子节点,如果有多个Element节点,那么返回最先读取到的element
            if(element != null){  
                System.out.println("子节点的文本:" + element.getText());//因为子节点和根节点都是Element对象所以它们的操作方式都是相同的  
            } 
            //但是有些情况xml比较复杂,规范不统一,某个节点不存在直接java.lang.NullPointerException,所以获取到element对象之后要先判断一下是否为空  
            List<Element> list = rootElement.getChildren("Element");//返回的是List集合
            for (Element ele : list) {
			}			
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		JDomOperateXmlDemo demo = new JDomOperateXmlDemo();
		demo.parseXml01();
	}
}
另外上面的xml在src下面,document01.xml具体如下:

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <Document id="doc01">  
  3.     根节点的内容  
  4.     <Element>子节点的内容</Element>  
  5.  </Document>  
<?xml version="1.0" encoding="UTF-8" ?>
<Document id="doc01">
	根节点的内容
	<Element>子节点的内容</Element>
 </Document>
接下来执行该类的main方法,console效果如下:


根据控制台显示可知:

   <1>如果new SAXBuilder(false)指定为true,指定运行会报错:Document is invalid: no grammar found.  简单的说就是没有导入语法文件,比如dtd文件等等,所以jdom在验证xml规范的时候还是非常严格的;
   <2>这里发现jdom解析xml区分大小写,就是区分指定节点名称,但是dom4j是不区分的;

   <3>有些情况xml比较复杂,规范不统一,某个节点不存在直接报错:java.lang.NullPointerException,所以获取到element对象之后要先判断一下是否为空。


上面只是简单的获取了xml的根目录的元素,接下来使用ArrayList集合循环document文档对象。

具体代码如下:

  1. public void parseXml02(){  
  2.     String xmlPath = "D:\\project\\dynamicWeb\\src\\resource\\document02.xml";    
  3.     try {  
  4.         //创建SAX建造者对象,该类构造方法的重载boolean类型的方法中validate表示是否验证xml文档。  
  5.         SAXBuilder saxBuilder = new SAXBuilder(false);  
  6.         InputStream inputStream = new FileInputStream(new File(xmlPath));    
  7.         //解析xml文档,返回document文档对象  
  8.         Document document = saxBuilder.build(inputStream);  
  9.         Element rootElement = document.getRootElement();//根节点  
  10.           
  11.         List<Element> elementList = rootElement.getChildren("Element");  
  12.         for (Element element : elementList) {  
  13.             System.out.println("【" + element.getName() + "】:" + element.getTextTrim());//如果有子节点就返回空字符串  
  14.             Element nameElement = element.getChild("name");  
  15.             if(nameElement != null){  
  16.                 System.out.println("   " + nameElement.getName() + ":" + nameElement.getTextTrim());  
  17.             }  
  18.             Element valueElement = element.getChild("value");  
  19.             if(valueElement != null){  
  20.                 System.out.println("   " + valueElement.getName() + ":" + valueElement.getTextTrim());  
  21.             }  
  22.             Element descriptElement = element.getChild("descript");  
  23.             if(descriptElement != null){  
  24.                 System.out.println("   " + descriptElement.getName() + ":" + descriptElement.getTextTrim());  
  25.             }  
  26.         }  
  27.     } catch (JDOMException e) {  
  28.         e.printStackTrace();  
  29.     } catch (IOException e) {  
  30.         e.printStackTrace();  
  31.     }  
  32. }  
	public void parseXml02(){
		String xmlPath = "D:\\project\\dynamicWeb\\src\\resource\\document02.xml";  
		try {
			//创建SAX建造者对象,该类构造方法的重载boolean类型的方法中validate表示是否验证xml文档。
			SAXBuilder saxBuilder = new SAXBuilder(false);
			InputStream inputStream = new FileInputStream(new File(xmlPath));  
			//解析xml文档,返回document文档对象
			Document document = saxBuilder.build(inputStream);
			Element rootElement = document.getRootElement();//根节点
			
			List<Element> elementList = rootElement.getChildren("Element");
			for (Element element : elementList) {
				System.out.println("【" + element.getName() + "】:" + element.getTextTrim());//如果有子节点就返回空字符串
				Element nameElement = element.getChild("name");
				if(nameElement != null){
					System.out.println("   " + nameElement.getName() + ":" + nameElement.getTextTrim());
				}
				Element valueElement = element.getChild("value");
				if(valueElement != null){
					System.out.println("   " + valueElement.getName() + ":" + valueElement.getTextTrim());
				}
				Element descriptElement = element.getChild("descript");
				if(descriptElement != null){
					System.out.println("   " + descriptElement.getName() + ":" + descriptElement.getTextTrim());
				}
			}
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
另外上面的xml在src下面,document02.xml具体如下:

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <Document id="doc01">  
  3.     根节点的内容  
  4.     <Element>子节点的内容</Element>  
  5.     <Element id="ele01">  
  6.         <name><![CDATA[节点的名称]]></name>  
  7.         <value><![CDATA[节点的值]]></value>  
  8.         <descript><![CDATA[节点的描述]]></descript>  
  9.     </Element>      
  10.     <Element id="ele02">  
  11.         <name><![CDATA[节点的名称<2>]]></name>  
  12.         <value><![CDATA[节点的值<2>]]></value>  
  13.         <descript><![CDATA[节点的描述<2>]]></descript>  
  14.     </Element>  
  15.  </Document>  
<?xml version="1.0" encoding="UTF-8" ?>
<Document id="doc01">
	根节点的内容
	<Element>子节点的内容</Element>
	<Element id="ele01">
		<name><![CDATA[节点的名称]]></name>
		<value><![CDATA[节点的值]]></value>
		<descript><![CDATA[节点的描述]]></descript>
	</Element>	
	<Element id="ele02">
		<name><![CDATA[节点的名称<2>]]></name>
		<value><![CDATA[节点的值<2>]]></value>
		<descript><![CDATA[节点的描述<2>]]></descript>
	</Element>
 </Document>
接下来执行该类的main方法,console效果如下:


根据控制台显示可知:

   <1>直接解析就会报错:Error on line 11: The content of elements must consist of well-formed character data or markup.  因为标签的内容中包含标签标记符号,使用<![CDATA[]]>标记会被当成文本信息不被解析;
   <2>因为是getChildren("Element");有指定具体元素名称,所以只会获取Element节点,另外节点的子节点包含Element节点不会被获取,所以getChildren("Element");没有递归获取子元素;


jdom不但能够解析xml对象,并且在解析的时候还可以操作document对象,重新构造一个新的Document文档对象。

具体代码如下:

  1. public void operateXml01(){  
  2.        String xmlPath = "D:\\project\\dynamicWeb\\src\\resource\\document03.xml";    
  3.     try {  
  4.         //创建SAX建造者对象,该类构造方法的重载boolean类型的方法中validate表示是否验证xml文档。  
  5.         SAXBuilder saxBuilder = new SAXBuilder(false);  
  6.         InputStream inputStream = new FileInputStream(new File(xmlPath));    
  7.         //4、使用InputSource输入源作为参数也可以转换xml    
  8.         InputSource inputSource = new InputSource(inputStream);  
  9.         //解析xml文档,返回document文档对象  
  10.         Document document = saxBuilder.build(inputSource);  
  11.         Element rootElement = document.getRootElement();//根节点  
  12.         /* 
  13.         rootElement.setName("root");//支持修改节点名称   
  14.         System.out.println("根节点修改之后的名称:" + rootElement.getName());   
  15.         rootElement.setText("text"); //同样修改标签内的文本也一样   
  16.         System.out.println("根节点修改之后的文本:" + rootElement.getText());   
  17.         */  
  18.         //接下来根据id获取元素 添加子元素或者删除子节点  
  19.         List<Element> elementList = rootElement.getChildren();  
  20.         System.out.println("删除节点前的集合个数:"+elementList.size());  
  21.         for (Element element : elementList) {  
  22.             if(element.getAttributeValue("id")!=null){  
  23.                 if(element.getAttributeValue("id").equals("ele01")){  
  24.                     Element element01 = new Element("new_name");  
  25.                     element01.setText("新添加的名称");  
  26.                     Element element02 = new Element("new_value");  
  27.                     element02.setText("新添加的名称");  
  28.                     Element element03 = new Element("new_descript");  
  29.                     element03.setText("新添加的名称");  
  30.                     element.addContent(element01);  
  31.                     element.addContent(element02);  
  32.                     element.addContent(element03);  
  33.                 }else if(element.getAttributeValue("id").equals("ele02")){  
  34.                     /* 
  35.                     rootElement.removeContent(element); 
  36.                     break; 
  37.                     */  
  38.                     element.removeContent();  
  39.                     System.out.println("删除节点后的集合个数:"+elementList.size());  
  40.                 }  
  41.             }  
  42.         }  
  43.         elementList = rootElement.getChildren("Element");  
  44.         for (Element element : elementList) {  
  45.             System.out.println("【" + element.getName() + "】:" + element.getTextTrim());//如果有子节点就返回空字符串  
  46.             Element nameElement = element.getChild("new_name");  
  47.             if(nameElement != null){  
  48.                 System.out.println("   " + nameElement.getName() + ":" + nameElement.getTextTrim());  
  49.             }  
  50.             Element valueElement = element.getChild("new_value");  
  51.             if(valueElement != null){  
  52.                 System.out.println("   " + valueElement.getName() + ":" + valueElement.getTextTrim());  
  53.             }  
  54.             Element descriptElement = element.getChild("new_descript");  
  55.             if(descriptElement != null){  
  56.                 System.out.println("   " + descriptElement.getName() + ":" + descriptElement.getTextTrim());  
  57.             }  
  58.         }  
  59.     } catch (JDOMException e) {  
  60.         e.printStackTrace();  
  61.     } catch (IOException e) {  
  62.         e.printStackTrace();  
  63.     }  
  64. }  
	public void operateXml01(){
        String xmlPath = "D:\\project\\dynamicWeb\\src\\resource\\document03.xml";  
		try {
			//创建SAX建造者对象,该类构造方法的重载boolean类型的方法中validate表示是否验证xml文档。
			SAXBuilder saxBuilder = new SAXBuilder(false);
			InputStream inputStream = new FileInputStream(new File(xmlPath));  
			//4、使用InputSource输入源作为参数也可以转换xml  
			InputSource inputSource = new InputSource(inputStream);
			//解析xml文档,返回document文档对象
			Document document = saxBuilder.build(inputSource);
			Element rootElement = document.getRootElement();//根节点
			/*
	        rootElement.setName("root");//支持修改节点名称  
	        System.out.println("根节点修改之后的名称:" + rootElement.getName());  
	        rootElement.setText("text"); //同样修改标签内的文本也一样  
	        System.out.println("根节点修改之后的文本:" + rootElement.getText());  
	        */
	        //接下来根据id获取元素 添加子元素或者删除子节点
	        List<Element> elementList = rootElement.getChildren();
	        System.out.println("删除节点前的集合个数:"+elementList.size());
	        for (Element element : elementList) {
	        	if(element.getAttributeValue("id")!=null){
					if(element.getAttributeValue("id").equals("ele01")){
						Element element01 = new Element("new_name");
						element01.setText("新添加的名称");
						Element element02 = new Element("new_value");
						element02.setText("新添加的名称");
						Element element03 = new Element("new_descript");
						element03.setText("新添加的名称");
						element.addContent(element01);
						element.addContent(element02);
						element.addContent(element03);
					}else if(element.getAttributeValue("id").equals("ele02")){
						/*
						rootElement.removeContent(element);
						break;
						*/
						element.removeContent();
						System.out.println("删除节点后的集合个数:"+elementList.size());
					}
	        	}
			}
	        elementList = rootElement.getChildren("Element");
			for (Element element : elementList) {
				System.out.println("【" + element.getName() + "】:" + element.getTextTrim());//如果有子节点就返回空字符串
				Element nameElement = element.getChild("new_name");
				if(nameElement != null){
					System.out.println("   " + nameElement.getName() + ":" + nameElement.getTextTrim());
				}
				Element valueElement = element.getChild("new_value");
				if(valueElement != null){
					System.out.println("   " + valueElement.getName() + ":" + valueElement.getTextTrim());
				}
				Element descriptElement = element.getChild("new_descript");
				if(descriptElement != null){
					System.out.println("   " + descriptElement.getName() + ":" + descriptElement.getTextTrim());
				}
			}
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
另外上面的xml在src下面,document03.xml具体如下:
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <Document id="doc01">  
  3.     根节点的内容  
  4.     <Element>子节点的内容</Element>  
  5.     <Element id="ele01">  
  6.         <Content>节点内容1</Content>  
  7.     </Element>      
  8.     <Element id="ele02">  
  9.         <Content>节点内容2</Content>  
  10.     </Element>  
  11.  </Document>  
<?xml version="1.0" encoding="UTF-8" ?>
<Document id="doc01">
	根节点的内容
	<Element>子节点的内容</Element>
	<Element id="ele01">
		<Content>节点内容1</Content>
	</Element>	
	<Element id="ele02">
		<Content>节点内容2</Content>
	</Element>
 </Document>
接下来执行该类的main方法,console效果如下:

根据控制台显示可知:

   <1>执行上面的修改根节点操作会影响下面,因为setText()会直接覆盖掉根节点下的子节点;
   <2>开始删除节点使用的是rootElement.removeContent(element);直接删除节点的方法,直接报错:Exception in thread "main" java.util.ConcurrentModificationException  除非删除之后立刻执行break;另外调用element.removeContent();就不会出现这样的问题;

   <3>根据输出节点集合的个数可知,再循环的时候改变集合数量会直接影响循环,因为循环过程中并没有随着数量的修改而改变循环的次数。但element.removeContent(); 不一样,循环至始至终集合数量都没有发生改变,只是将这个节点的引用置为null了。


2、生成xml文档

JDom能够解析xml,同样肯定能生成xml,而且使用起来更加简单方便。

实现思路:

   <1>创建Document对象,添加节点以及节点下的文本、名称和属性值;

   <2>创建XMLOutputter的实例,调用output()方法把document写入磁盘;

具体代码如下:

  1. public void buildXml01(){  
  2.     //自己封装xml文档对象  
  3.     Element rootElement = new Element("Document");  
  4.     Element element = new Element("Element");  
  5.       
  6.     Element nameElement = new Element("name");  
  7.     nameElement.setText("<名称>");  
  8.     Element valueElement = new Element("value");  
  9.     valueElement.setText("<值 >\"\\");  
  10.     Element descriptionElement = new Element("description");  
  11.     descriptionElement.setText("<描述><![CDATA[<查看是否转义保存>]]>");  
  12.     //添加子节点  
  13.     element.addContent(nameElement);  
  14.     element.addContent(valueElement);  
  15.     element.addContent(descriptionElement);  
  16.       
  17.     rootElement.addContent(element);  
  18.       
  19.     Document document = new Document(rootElement);  
  20.     DocType docType = new DocType("Doctype");  
  21.     document.setDocType(docType);  
  22.       
  23.     XMLOutputter xmloutputter = new XMLOutputter();  
  24.     OutputStream outputStream;  
  25.     try {  
  26.         outputStream = new FileOutputStream("c:\\document.xml");  
  27.         xmloutputter.output(document, outputStream);  
  28.         System.out.println("xml文档生成成功!");  
  29.     } catch (FileNotFoundException e) {  
  30.         e.printStackTrace();  
  31.     } catch (IOException e) {  
  32.         e.printStackTrace();  
  33.     }  
  34. }  
	public void buildXml01(){
		//自己封装xml文档对象
		Element rootElement = new Element("Document");
		Element element = new Element("Element");
		
		Element nameElement = new Element("name");
		nameElement.setText("<名称>");
		Element valueElement = new Element("value");
		valueElement.setText("<值 >\"\\");
		Element descriptionElement = new Element("description");
		descriptionElement.setText("<描述><![CDATA[<查看是否转义保存>]]>");
		//添加子节点
		element.addContent(nameElement);
		element.addContent(valueElement);
		element.addContent(descriptionElement);
		
		rootElement.addContent(element);
		
		Document document = new Document(rootElement);
		DocType docType = new DocType("Doctype");
		document.setDocType(docType);
		
		XMLOutputter xmloutputter = new XMLOutputter();
		OutputStream outputStream;
		try {
			outputStream = new FileOutputStream("c:\\document.xml");
			xmloutputter.output(document, outputStream);
			System.out.println("xml文档生成成功!");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

接下来执行该类的main方法,console提示生成成功。

然后到c盘根目录寻找document.xml,具体如下:

实践发现:

   <1>如果不指定编码,生成的xml默认是UTF-8编码的;
   <2>节点内的文本内容包含标签标记符都会被转义成&lt; &gt; ,,但是其他特殊符号就不会,比如空格,双引用,单引号,斜杠 等等。


三、几种解析XML方式的比较

前面依次介绍了三种操作xml的方式,分别是:

   Dom4j解析和生成XML文档,  地址:http://blog.csdn.net/chenghui0317/article/details/11486271

   Dom解析和生成XML文档,  地址:http://blog.csdn.net/chenghui0317/article/details/11662667

   SAX解析和生成XML文档,  地址:http://blog.csdn.net/chenghui0317/article/details/11990891 

   <1>Dom4j的xml解析性能最好,目前有许多开源项目都在使用Dom4j解析xml文档,比如hibernate,另外Dom4j解析的时候采用面向对象,所有的节点都是用Element封装之后返回,非常方便使用和调用;

   <2>SAX解析xml性能较好,因为它是采用DefaultHandler事件处理者来解析的,但是不好的地方在于每一个节点的名称,属性和内容都被分开了,也没有使用对象封装,所以在解析之后封装对象上面比较麻烦,稍微不注意就会使空文本覆盖掉应该存放的值;

   <3>JDom在解析xml性能上表现不是很好,虽然JDom 和 Dom4j在解析上有很多相似之后,大多差距都是方法名称不同但是具体含义相同,所以使用起来还是蛮方便的;

   <4>Dom在解析xml性能上表现也不是很好,另外Dom在解析xml使用的时候感觉是最不方便的,Dom并没有把解析的节点封装成对象,并且很容易受到非空内容的节点影响,导致解析抛异常。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值