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);
posted @ 2019-05-24 16:11  小cai一碟  阅读(385)  评论(0编辑  收藏  举报