xml介绍

html是超文本标记语言,在Java中配置文件主要用2类:

Properties配置文件:主要配置的是由key=value组成的信息

xml配置文件:xml可以配置更加复杂的数据关系。

xml语法

xml的语法主要由下面几部分组成:

文档声明

元素-标签

属性-存在标签中

注释  <!--    -->  

文档声明

要书写一个正确的xml文件,首先需要在文件的开始部分声明这个文件是一个xml文件。

声明格式:

<?xml  xml的版本  xml的编码  xml是否依赖于其他的xml文件     ?>

<?xml version=”1.0”  encoding=”编码表的名称”  ?>

例如:<?xml version="1.0" encoding="gbk"?>

细节:在书写xml的声明时,声明必须以 <?xml   开始   必须是?>结束, 在<?xml中间不能有任何的其他符号。

在xml声明中书写的encoding 是告诉解析引擎使用什么编码表去解析这个xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="U8650"/>
        <Type name="HW123"/>
        <Type name="HW321"/>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone12"/>
    </Brand>
</PhoneInfo>

xml解析

xml文件主要用来传输数据,作为配置文件,或者存储数据。不管做为哪种应用,最终都需要把xml中的数据解析出来。就必须研究xml的解析。

dom4j

由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷。

DOM4J 表现更优秀,具有性能优异、功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml。dom4j是一套开源的api。实际项目中,往往选择dom4j来作为解析xml的利器。

使用步骤:

1:导入Jar包

2:创建SAXReader:来读取XML文档

3:使用read方法读取xml文件

4:对xml文件中的元素进行操作(CRUD)

练习:

将XML文档中的元素解析并显示出来

SAXReader reader = new SAXReader();
	Document doc = reader.read("src/phoneInfo.xml");
	Element rootEle = doc.getRootElement();//获取根标签
	
	System.out.println("根节点是:"+rootEle.getName());
	
	List<Element> brand = rootEle.elements();//获取所有根节点的子节点
	
	//attribute-表示的是属性     element-表示的是节点
	
	//循环遍历eleLIst,取出每一个子标签,ele - value
	for (Element ele : brand) {	
		String eleName = ele.getName();//标签名字
		int size = brand.size();	
		List<Attribute> attrList = ele.attributes();//获取当前标签的所有的属性,组成一个集合 
		
		System.out.println("\t根节点的子节点是"+eleName);	
		
		//循环遍历attrList。取出所有的key与value
		for (Attribute attr : attrList) {		
			String attrName = attr.getName();//属性名
			String attrValue = attr.getValue();//属性值
			
			System.out.println("\t当前节点的属性名是:"+attrName+",属性值是:"+attrValue);
			
			List<Element> type = ele.elements();//取出子节点下的元素
			for (Element types : type) {
				Attribute attrs = types.attribute("name");//通过属性的名字,获取属性对象
				String name = attrs.getName();
				String value = attrs.getValue();
				System.out.println("\t\t\t当前的节点名是"+types.getName()+"属性名是:"+name+"属性值是:"+value);
			}
		}
	}

向文档中添加节点与属性

SAXReader reader = new SAXReader();
	Document doc = reader.read("src/phoneInfo.xml");
	Element rootEle = doc.getRootElement();//获取根标签
    //rootEle添加一个子节点,新的子节点
	Element addBrand = rootEle.addElement("Brand");
	addBrand.addAttribute("name", "vivo");
	//为brand添加子节点
	Element addType = addBrand.addElement("Type");
	addType.addAttribute("name", "V40");
	
	//持久化,写进去
	File toFlie = new File("src/phoneInfo.xml");
	OutputStream outFile  = new FileOutputStream(toFlie);
	OutputFormat format = OutputFormat.createPrettyPrint();
	XMLWriter write = new XMLWriter(outFile, format);
	
	write.write(doc);
	write.flush();
	write.close();

讲文档中相对应的元素删除

SAXReader reader = new SAXReader();
	Document doc = reader.read("src/phoneInfo.xml");
	Element rootEle = doc.getRootElement();//获取根标签
	List<Element> brand = rootEle.elements();//获取所有根节点的子节点
	for (Element eles : brand) {
		List<Attribute> list = eles.attributes();
		Attribute attr = list.get(0);
		String value = attr.getValue();
		if("苹果".equals(value))
		{
			rootEle.remove(eles);
		}
	}
	
	File toFlie = new File("src/phoneInfo.xml");
	OutputStream outFile  = new FileOutputStream(toFlie);
	OutputFormat format = OutputFormat.createPrettyPrint();
	XMLWriter write = new XMLWriter(outFile, format);
	
	
	write.write(doc);
	write.flush();
	write.close();