2021-09-29 XML文档即文档解析

本文详细介绍了如何使用Dom4j库在Java中创建XML文档,包括定义根节点和子节点,并通过示例展示了如何设置属性和内容。此外,还演示了使用Dom4j解析XML文档的方法,通过递归遍历所有节点。最后,简要介绍了XPath路径语言,展示了如何选取XML文档中的特定节点。
摘要由CSDN通过智能技术生成

一.XML文档结构

首先,了解一下什么是XML文档,类似与Html的标签,但是标签名都是由自己定义的,XML是可扩展标记语言,用于存储数据,标签都是成对出现

<?xml version="1.0" encoding="UTF-8"?> <!-- 声明文档类型和字符编码 -->
<GenMulu><!-- 根目录 -->
    <ZiMulu1 id = "1"> <!-- 子目录 属性需要使用“或‘包裹-->
        <name>名字</name> <!-- 存储的数据 -->
        <age>年龄</age>
    </ZiMulu1>
        <ZiMulu1 id = "2">
        <name>名字2</name>
        <age>年龄2</age>
    </ZiMulu1>
</GenMulu>

XML文档常用于数据传输,具有跨平台性

二.使用Dom4j创建XML文档

首先下载Java拓展的jar包
//这个是dom4j的jir包
链接:https://pan.baidu.com/s/10YGDU3IBsW3jOvGFiE5sPA
提取码:2022

直接上代码:

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

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

public class Dom4j创建 {
	public static void main(String[] args) {
		// 船舰document的文档对象
		Document doc = DocumentHelper.createDocument();
		//创建根节点
		Element element = DocumentHelper.createElement("herolist");
		doc.setRootElement(element);
		
		//创建子节点
		Element hero = DocumentHelper.createElement("hero");
		hero.addAttribute("id", "001");
		element.add(hero);
		
		//子节点里面的子节点
		Element name = DocumentHelper.createElement("name");
		name.setText("亚瑟");
		hero.add(name);
		
		Element sex = DocumentHelper.createElement("sex");
		sex.setText("男");
		hero.add(sex);
		

		Element price = DocumentHelper.createElement("price");
		price.setText("13888");
		hero.add(price);
		 
		Element hero2 = DocumentHelper.createElement("hero");
		hero2.addAttribute("id", "002");
		element.add(hero2); 
		
		Element name1 = DocumentHelper.createElement("name");
		name1.setText("程咬金");
		hero2.add(name1);
		
		Element sex1 = DocumentHelper.createElement("sex");
		sex1.setText("男");
		hero2.add(sex1);
		

		Element price1 = DocumentHelper.createElement("price");
		price1.setText("13888");
		hero2.add(price1);
		
        OutputFormat ou = OutputFormat.createPrettyPrint();	//输出格式化,使用美丽的方式输出,就是输出的是适合你看的,输入create另外两个选项可以试一下
		ou.setEncoding("GBK");//定义的输出格式,eclipse的默认是GBK
		
		try {
			XMLWriter xmls = new XMLWriter(new FileWriter("英雄列表2.xml"),ou);//输出流进行输出,两个参数分别是输出的地址和输出格式化
			xmls.write(doc);//输出
			xmls.flush();//清空缓存区
			xmls.close();//关闭资源
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

成果:

<?xml version="1.0" encoding="GBK"?>

<herolist>
  <hero id="001">
    <name>亚瑟</name>
    <sex></sex>
    <price>13888</price>
  </hero>
  <hero id="002">
    <name>程咬金</name>
    <sex></sex>
    <price>13888</price>
  </hero>
</herolist>

总结一下:
就是创建代表总体的Document对象,然后创建节点,设置根节点,在根节点下设置子节点,子节点设置属性,内容或者在子节点内设置孙节点,孙节点内设置曾孙节点。。。
注意将字节点添加到父节点时,不要添加错了地方

三. 使用Dom4j解析XML文档

直接上代码:

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

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dom4j解析 {
	
	public static void main(String[] args) {
		SAXReader reader = new SAXReader();//创建XML的输入流
		try {
			//读取整个XML文档,创建Document对象,Document对象一般表示整个XML文档
			Document dou = reader.read(new File("D:\\储存\\eclipse储存\\JavaGaoJi\\src\\demo5\\英雄列表.xml"));
		    //根据Document对象获取根节点对象
			Element element = dou.getRootElement();
			//自己定义一个递归方法,用于获取全部的数据
			//递归就是在方法体内调用方法本省,理论上循环能干的事情,递归也能干,但是递归的速度较慢
		    list(element);
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void list(Element e) {
		//输出节点名称
		System.out.print("<"+e.getName()+" ");
		//获取全部的数据,使用list集合保存
		List<Attribute> attribute = e.attributes();
		//循环获取全部的属性并输出
		Attribute att = null;
		for(int i=0;i<attribute.size();i++) {
			att = attribute.get(i);
			System.out.print(att.getName()+"="+att.getValue()+" ");
		}
		System.out.println(">"); //到这里也就表示一个节点的开头写完了
		//判断这个节点中是否有数据,有的话则进行输出
		//e.getTextTrim()这个方法和e.getText()的区别是不会将空格和换行符算入数据中 
		if(!e.getTextTrim().equals("")) {
			System.out.println(e.getText()); 
		}
		//获取该节点的全部字节点,使用Iterator进行保存,方便递归
		Iterator<Element> as = e.elementIterator();
		
		//循环读取该节点中的全部信息
		while(as.hasNext()) {//hasNext()判断该对象是否还有内容
			Element el = as.next(); //读取下一个内容
			list(el);  //递归
		}
		//当递归到最后的时候,在返回来,就会输出每一个节点的尾标签
		System.out.println("< /"+e.getName()+">");//递归完后进行输出
		
		   
	} 

}

递归简洁而言就是在方法内调用该方法,一直到最后全部的节点都被访问过后在结束

运行结果:

在这里插入图片描述

四 . Xpath路径语言

简介:Xpath用于确认XML文档中某部分的位置的语言

照常的先下载相应的jar包
链接:https://pan.baidu.com/s/1oxM6e_i-vle7uuEMghvOQg
提取码:2022

常用的表达式:

  • / 从根节点选取
  • // 从匹配选择的当前节点,选择文档中的节点,不考虑他们的位置
  • . 选取当前节点的父节点
  • @ 选取属性

常用谓语:

  • /note/info[1] 选取属于note元素的第一个info元素
  • /note/info[last()] 选取note元素的最后一个info元素
  • //info[@id] 获取所有属性名为id的info元素
  • info[@id=‘2’] 获取所有属性名为id且值为2的info元素
  • /note/info[price>5] 选取note节点下的所有的info元素,且其子元素的price的值必须大于5

上代码:

import java.io.File;
import java.util.List;

import org.dom4j.*;
import org.dom4j.io.*;


public class Xpath路径语言 {
   public static void main(String[] args) {
	   //创建SAXReader对象
	   SAXReader sax = new SAXReader();
	    
	   try {
		Document doc = sax.read(new File("D:\\储存\\eclipse储存\\Java高级程序设计\\src\\第五章XML\\booksss.xml"));
		  List<Node> list = doc.selectNodes("/books");//获取根节点。。。
		  for(int i=0;i<list.size();i++) {
			  System.out.println(list.get(0).getName()); 
		  } 
		  List<Node> lis = doc.selectNodes("//boo[@id='2']");  
		  for(int i=0;i<lis.size();i++) {
			  System.out.println(lis.get(0).getStringValue());  
		  }
	   } catch (DocumentException e) { 
		// TODO Auto-generated catch block
		e.printStackTrace();
	}  
	   
	 
	   
   }
}
<?xml version="1.0" encoding="UTF-8"?>

<books id = "3">
  <book id="1">一二三四五</book>
  <boo id="2">上山打老斧</boo>
</books>

输出结果:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习,赚钱,植发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值