zoukankan      html  css  js  c++  java
  • dom 4 j 操作xml教程

    先去官网下载jar包

    还有dom4j的依赖jar包下载

    目录

    基础操作
    XPath 解析xml文件
    迭代器循环遍历
    快速循环
    创建新的XML文档
    对XML文档进行增、删、改、查
    文档字符串相互转换

    基础操作

    这是我们要读取的xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    	<!--
    		config标签:可以包含0~N个action标签
    	-->
    <config name="zs" age="18" sex="男">
    	<!--
    		action标签:可以饱含0~N个forward标签
    		path:以/开头的字符串,并且值必须唯一 非空
    		type:字符串,非空
    	-->
    	<action path="/regAction" type="test.RegAction">
    		<!--
    			forward标签:没有子标签; 
    			name:字符串,同一action标签下的forward标签name值不能相同 ;
    			path:以/开头的字符串
    			redirect:只能是false|true,允许空,默认值为false
    		-->
    		<forward name="failed" path="/reg.jsp" redirect="false" />
    		<forward name="success" path="/login.jsp" redirect="true" />
    	</action>
    	<foo>
    	</foo>
    	<action path="/loginAction" type="test.LoginAction">
    		<forward name="failed" path="/login.jsp" redirect="false" />
    		<forward name="success" path="/main.jsp" redirect="true" />
    	</action>
    </config>
    

    得到文档对象

    	SAXReader saxReader = new SAXReader();
       	Document document = saxReader.read(new File("src/config.xml"));
    

    获取根节点
    Element就是节点类。

    Element element = document.getRootElement();
    

    获取指定节点下的直接子节点

    List<Element>  elements = element.elements();
    

    获取节点的属性值

    document.getRootElement().attributeValue("name")
    

    获取节点下的指定子节点对象

    Element e = document.getRootElement().element("action");
    

    获取节点的文本

    		Element foo = document.getRootElement().element("foo");
    		System.out.println(foo.getText());
    

    XPath 解析xml文件

    使用xPath强大的功能快速定位目标元素

    		SAXReader saxReader = new SAXReader();
    		Document document = saxReader.read(new File("xml路径"));
    		//查找 config 标签下的 action 标签下的所有forward标签,返回多个
    		List<Node>  list = document.selectNodes("/config/action/forward");
    		//查找config标签下的action标签,如果有多个返回一个
    		Node node = document.selectSingleNode("/config/action");
    		//注意Node可以强转成Element
    		Element element = (Element)node;
    

    迭代器循环遍历

    	public static void bar(Document document) {
    		Element root = document.getRootElement();
    
    		// 迭代root节点下的直接子节点
    		for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
    			Element element = it.next();
    			System.out.println(element.getName());
    		}
    		System.out.println("我是分割线 ---------- root.elementIterator("foo")");
    		// 迭代root节点下的直接子节点, 但只迭代节点名是 foo的节点
    		for (Iterator<Element> it = root.elementIterator("foo"); it.hasNext();) {
    			Element foo = it.next();
    			System.out.println(foo.getName());
    		}
    		System.out.println("我是分割线-------------  root.attributeIterator()");
    		// 迭代root节点的所以属性
    		for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext();) {
    			Attribute attribute = it.next();
    			System.out.println("name:" + attribute.getName() + "value:" + attribute.getValue());
    		}
    	}
    

    快速循环

    如果您必须使用大型XML文档树,那么为了提高性能,我们建议您使用快速循环方法,这样可以避免Iterator为每个循环创建对象的成本。例如

    public void treeWalk(Document document) {
        treeWalk(document.getRootElement());
    }
    
    public void treeWalk(Element element) {
        for (int i = 0, size = element.nodeCount(); i < size; i++) {
            Node node = element.node(i);
            if (node instanceof Element) {
                treeWalk((Element) node);
            }
            else {
                // do something…
            }
        }
    }
    

    创建新的XML文档

    	public static Document createDocument()  {
    		Document document = DocumentHelper.createDocument();
    		Element persons = document.addElement("person");
    		
    		Element person = persons.addElement("person").addAttribute("id", "1");
    		person.addElement("name").addText("张三");
    		person.addElement("age").addText("18");
    		person.addElement("sex").addText("男");
    
    		
    		Element person2 = persons.addElement("person").addAttribute("id", "2");
    		person2.addElement("name").addText("王五");
    		person2.addElement("age").addText("2");
    		person2.addElement("sex").addText("女");
    		
    		return document;
    	}
    

    将文档写入
    这种方式有个缺点就是格式非常不美观,如果要美观的格式下面会讲

    		FileWriter out = new FileWriter("foo.xml");
    		createDocument().write(out);
    		out.close();
    

    格式美观的

    	public static void write(Document document) throws IOException {
    		//设置输出流来生成一个xml文件
    		OutputStream os = new FileOutputStream("etoak2.xml");
    		// Format格式输出格式刷
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		// 设置xml编码
    		format.setEncoding("utf-8");
    
    		// 写:传递两个参数一个为输出流表示生成xml文件在哪里
    		// 另一个参数表示设置xml的格式
    		XMLWriter xw = new XMLWriter(os, format);
    		// 讲内容写入文件中去
    		xw.write(document);
    		// 清空缓存关闭资源
    		xw.flush();
    		xw.close();
    	}
    

    对XML文档进行增、删、改、查

    原XML

    <Persons> 
      <Person> 
        <Name>张三</Name>  
        <Age>19</Age>  
        <Sex>男</Sex> 
      </Person>  
      <Person> 
        <Name>李四</Name>  
        <Age>19</Age>  
        <Sex>女</Sex> 
      </Person> 
    </Persons>
    

    添加一个节点

    	public static void add() throws Exception {
    		SAXReader reader = new SAXReader();
    		Document document = reader.read(new File("foo.xml"));
    		Element root = document.getRootElement();
    
    		// 获取第一个人
    		Element firstPerson = (Element) root.elements("Person").get(0);
    		// 获取第一个节点下的所有节点
    		List<Element> list = firstPerson.elements(); // [姓名,年龄,性别]
    
    		// 创建一个节点
    		Element miaoshu = DocumentHelper.createElement("address");
    		miaoshu.setText("上海");
    		list.add(2, miaoshu);
    
    		// 格式化输出流,同时指定编码格式。也可以在FileOutputStream中指定。
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		format.setEncoding("utf-8");
    
    		XMLWriter writer = new XMLWriter(new FileOutputStream("foo.xml"), format);
    		writer.write(document);
    		writer.close();
    	}
    

    结果

    <?xml version="1.0" encoding="utf-8"?>
    
    <Persons> 
      <Person> 
        <Name>张三</Name>  
        <Age>19</Age>  
        <address>上海</address>
        <Sex>男</Sex> 
      </Person>  
      <Person> 
        <Name>李四</Name>  
        <Age>19</Age>  
        <Sex>女</Sex> 
      </Person> 
    </Persons>
    

    删除节点

    	// 删除节点
        public static void delete() throws Exception {
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File("foo.xml"));
            Element root = document.getRootElement();
    
            // 获取第一个人
            Element person = (Element) root.elements("Person").get(0);
            Element address = (Element) person.element("address");
            // 获取到address节点的父节点并删除miaoshu节点
            address.getParent().remove(address);
    
            // 格式化输出流,同时指定编码格式。也可以在FileOutputStream中指定。
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("utf-8");
    
            XMLWriter writer = new XMLWriter(new FileOutputStream("foo.xml"), format);
            writer.write(document);
            writer.close();
    
        }
    

    结果

    <?xml version="1.0" encoding="utf-8"?>
    
    <Persons> 
      <Person> 
        <Name>张三</Name>  
        <Age>19</Age>  
        <Sex>男</Sex> 
      </Person>  
      <Person> 
        <Name>李四</Name>  
        <Age>19</Age>  
        <Sex>女</Sex> 
      </Person> 
    </Persons>
    
    

    修改

    	// 删除节点
        public static void update() throws Exception {
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File("foo.xml"));
            Element root = document.getRootElement();
    
            // 获取第一个人
            Element person = (Element) root.elements("Person").get(0);
            Element name = (Element) person.element("Name");
            // 修改姓名
            name.setText("富贵");
            //干脆添加一个属性玩玩
            name.addAttribute("href", "www.baidu.com");
    
            // 格式化输出流,同时指定编码格式。也可以在FileOutputStream中指定。
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("utf-8");
    
            XMLWriter writer = new XMLWriter(new FileOutputStream("foo.xml"), format);
            writer.write(document);
            writer.close();
    
        }
    

    结果

    <?xml version="1.0" encoding="utf-8"?>
    
    <Persons> 
      <Person> 
        <Name href="www.baidu.com">富贵</Name>  
        <Age>19</Age>  
        <Sex>男</Sex> 
      </Person>  
      <Person> 
        <Name>李四</Name>  
        <Age>19</Age>  
        <Sex>女</Sex> 
      </Person> 
    </Persons>
    
    

    文档字符串相互转换

    转为字符串

    Document document = …;
    String text = document.asXML();
    

    字符串解析成Document对象

    String text = "<person> <name>James</name> </person>";
    Document document = DocumentHelper.parseText(text);
    
  • 相关阅读:
    那么这几天都是自己和工作上的事情比较零零散散
    在大家都返现的时候却有人什么都不奉献
    今天觉得自己好像比较紧张
    今天是下午有雨
    今天是星期五,上班已经三个礼拜了
    今天晚上控制电脑前,要提前开机
    其实对于家里的电脑就是硬盘不太好
    家里主要忙着建立房子
    今天装了一个RTI工具
    昨天已经开始讲业务的部分
  • 原文地址:https://www.cnblogs.com/IT-CPC/p/10918720.html
Copyright © 2011-2022 走看看