使用dom4j解析xml文档

1.解析xml文档

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 使用dom4j解析xml文档
 * @author Administrator
 *
 */
public class Dom4jParseXmlDemo {
	
	public void parseXml01(){
		try{
			//将src下面的xml转换为输入流
			InputStream inputStream = new FileInputStream(new File("D:/project/dynamicWeb/src/resource/module01.xml")); 
			//InputStream inputStream = this.getClass().getResourceAsStream("/module01.xml");//也可以根据类的编译文件相对路径去找xml
			//创建SAXReader读取器,专门用于读取xml
            SAXReader saxReader = new SAXReader();
            //根据saxReader的read重写方法可知,既可以通过inputStream输入流来读取,也可以通过file对象来读取 
            //Document document = saxReader.read(inputStream);  
            Document document = saxReader.read(new File("D:/project/dynamicWeb/src/resource/module01.xml"));//必须指定文件的绝对路径
            //另外还可以使用DocumentHelper提供的xml转换器也是可以的。
            //Document document = DocumentHelper.parseText("<?xml version=\"1.0\" encoding=\"UTF-8\"?><modules id=\"123\"><module> 这个是module标签的文本信息</module></modules>");
            
            //获取根节点对象
            Element rootElement = document.getRootElement();  
            System.out.println("根节点名称:" + rootElement.getName());//获取节点的名称
            System.out.println("根节点有多少属性:" + rootElement.attributeCount());//获取节点属性数目
            System.out.println("根节点id属性的值:" + rootElement.attributeValue("id"));//获取节点的属性id的值
            System.out.println("根节点内文本:" + rootElement.getText());//如果元素有子节点则返回空字符串,否则返回节点内的文本
            //rootElement.getText() 之所以会换行是因为 标签与标签之间使用了tab键和换行符布局,这个也算是文本所以显示出来换行的效果。
            System.out.println("根节点内文本(1):" + rootElement.getTextTrim());//去掉的是标签与标签之间的tab键和换行符等等,不是内容前后的空格
            System.out.println("根节点子节点文本内容:" + rootElement.getStringValue()); //返回当前节点递归所有子节点的文本信息。
            
              //获取子节点
             Element element = rootElement.element("module");
      	    //List<Element> elements = rootElement.elements("module");//获取所有子节点为module的节点
		 if(element != null){ System.out.println("子节点的文本:" + element.getText());//因为子节点和根节点都是Element对象所以它们的操作方式都是相同的 } //但是有些情况xml比较复杂,规范不统一,某个节点不存在直接java.lang.NullPointerException,所以获取到element对象之后要先判断一下是否为空
		 rootElement.setName("root");//支持修改节点名称
		 System.out.println("根节点修改之后的名称:" + rootElement.getName());
		 rootElement.setText("text"); //同样修改标签内的文本也一样
		 System.out.println("根节点修改之后的文本:" + rootElement.getText());
		 } catch (Exception e)
		 { e.printStackTrace();
		 } 
		 }
	public static void main(String[] args) {
        Dom4jParseXmlDemo demo = new Dom4jParseXmlDemo();
	demo.parseXml01();}
	       }
		 }



被解析的xml:

<?xml version="1.0" encoding="UTF-8"?>
<modules id="123">
	<module> 这个是module标签的文本信息</module>
</modules>

2.xml文档的遍历
	public void parseXml03(){
		try{
			//将src下面的xml转换为输入流
			InputStream inputStream = this.getClass().getResourceAsStream("/module03.xml");
			//创建SAXReader读取器,专门用于读取xml
            SAXReader saxReader = new SAXReader();
            //根据saxReader的read重写方法可知,既可以通过inputStream输入流来读取,也可以通过file对象来读取
            Document document = saxReader.read(inputStream);
            
            Element rootElement = document.getRootElement();
            if(rootElement.elements("module") != null ){
            	//因为第一个module标签只有内容没有子节点,直接.iterator()就java.lang.NullPointerException了, 所以需要分开实现
            	List<Element> elementList = rootElement.elements("module");
            	for (Element element : elementList) {
            		if(!element.getTextTrim().equals("")){
            			System.out.println("【1】" + element.getTextTrim());
            		}else{
			            Element nameElement = element.element("name");
			            System.out.println("   【2】" + nameElement.getName() + ":" + nameElement.getText());
			            Element valueElement = element.element("value");
			            System.out.println("   【2】" + valueElement.getName() + ":" + valueElement.getText());
			            Element descriptElement = element.element("descript");
			            System.out.println("   【2】" + descriptElement.getName() + ":" + descriptElement.getText());
            			
            			List<Element> subElementList = element.elements("module");
                    	for (Element subElement : subElementList) {
                    		if(!subElement.getTextTrim().equals("")){
                    			System.out.println("      【3】" + subElement.getTextTrim());
                    		}else{
        			            Element subnameElement = subElement.element("name");
        			            System.out.println("      【3】" + subnameElement.getName() + ":" + subnameElement.getText());
        			            Element subvalueElement = subElement.element("value");
        			            System.out.println("      【3】" + subvalueElement.getName() + ":" + subvalueElement.getText());
        			            Element subdescriptElement = subElement.element("descript");
        			            System.out.println("      【3】" + subdescriptElement.getName() + ":" + subdescriptElement.getText());
                    		}
                    	}
            		}
				}
            }
	    } catch (Exception e) {  
            e.printStackTrace();  
        }  
	}

被解析的xml:
<?xml version="1.0" encoding="UTF-8"?>
<modules id="123">
     <module>这个是module标签的文本信息</module>
    <module id="">
        <name>oa</name>
        <value>系统基本配置</value>
        <descript>对系统的基本配置根目录</descript>
        <module>这个是子module标签的文本信息</module>
    </module>
     <module>
        <name>管理配置</name>
        <value>none</value>
        <descript>管理配置的说明</descript>
        <module id="106">
            <name>系统管理</name>
            <value>0</value>
            <descript>Config</descript>
            <module id="107">
                <name>部门编号</name>
                <value>20394</value>
                <descript>编号</descript>
            </module>
        </module>
    </module>
</modules>

3.xml文档的生成
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;

/**
 * 使用dom4j生成xml文档
 * @author Administrator
 *
 */
public class Dom4jBuildXmlDemo {
    public void build01(){
        try {
            //DocumentHelper提供了创建Document对象的方法
            Document document = DocumentHelper.createDocument();
            //添加节点信息
            Element rootElement = document.addElement("modules");
            //这里可以继续添加子节点,也可以指定内容
            rootElement.setText("这个是module标签的文本信息");
            Element element = rootElement.addElement("module");
            
            Element nameElement = element.addElement("name");
            Element valueElement = element.addElement("value");
            Element descriptionElement = element.addElement("description");
            nameElement.setText("名称");
            nameElement.addAttribute("language", "java");//为节点添加属性值
            valueElement.setText("值");
            valueElement.addAttribute("language", "c#");
            descriptionElement.setText("描述");
            descriptionElement.addAttribute("language", "sql server");
            System.out.println(document.asXML()); //将document文档对象直接转换成字符串输出
            Writer fileWriter = new FileWriter("c:\\module.xml");
            //dom4j提供了专门写入文件的对象XMLWriter
            XMLWriter xmlWriter = new XMLWriter(fileWriter);
            xmlWriter.write(document);
            xmlWriter.flush();
            xmlWriter.close();
            System.out.println("xml文档添加成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        Dom4jBuildXmlDemo demo = new Dom4jBuildXmlDemo();
        demo.build01();
    }
}

注:
如果有些时候需要获取xml中所有的文本信息,又或者别人传递的xml格式不规范,比如标签内名称大小写,虽然xml不区分大小写,但是必须成对出现,所以为了避免这种情况,索性可以将全部的标签名称换为大写,具体代码如下:
	public static void main(String[] args) {
		String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><modules id=\"123\"><module> 这个是module标签的文本信息<name>oa</name><value>系统基本配置</value><descript>对系统的基本配置根目录</descript></module></modules>";
		System.out.println(str.replaceAll("<[^<]*>", "_")); 
		Pattern pattern = Pattern.compile("<[^<]*>");
		Matcher matcher = pattern.matcher(str);
		while(matcher.find()){
			str = str.replaceAll(matcher.group(0), matcher.group(0).toUpperCase());
		}
		System.out.println(str);
		 
	}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值