在哪里用到Xml

Xml–(可扩展标记语言)

xml文件一般用作配置文件的书写,一般都是以成对的标签的出现的。

在web项目中可以经常看到 以 .xml 结尾的文件,这些文件内容形式就是xml形式,通过成对的标签中填入相应的值,并通过标签的嵌套来实现写入的数据的形式化封装,这个封装有什么意义?

其实在我看来就是为了在读取这种文件的时候提前将数据通过不同的标签名分类管理,读取的时候方便一点罢了。

分析
1.标签名可以自定义
2.大小写区分,标签的属性自定义
3.标签必须成对出现
4.作用:规范化数据,用于数据的传输和交互
5.作为配置文件,比如 web.xml

优势:可以规范化数据,结构比较丰富

劣势:结构比较复杂,解析起来很不方便
前后台交互一般不采用xml格式,xml一般用于配置文件
百分之九十以上的数据交互采用json格式,简单来说就是类似于对象和map的形式

手写一个XML文件

文件头,不可省略,是一个XML文件基本信息设置

<?xml version = ”1.0” encoding = ”utf-8” ?>


规范
1.大小敏感,不能会用关键字,不能使用包含空格及特殊字符
2.有且只有一个根标签

案子

<?xml version="1.0" encoding="UTF-8"?>
<food id="食物">
	<caixi des="豫菜">
		<name>大锅菜</name>
		<price>10</price>
		<name>开封灌汤包</name>
		<price>20</price>
	</caixi>
	<caixi des="川菜">
		<name>辣子鸡</name>
		<price>100</price>
		<name>麻婆豆腐</name>
		<price>20</price>
	</caixi>
	<caixi des="粤菜" score="80">
		<name>猴脑</name>
		<price>1000</price>
	</caixi>
</food>

Java的 XML 解析方式

Sax:把整个xml文件读入到内存中,很消耗内存
Dom:一行一行的解析

解析的技术

Japser: sun公出品,解析很不方便

Dom解析:sun公司的一批有为青年搞出来,非常好用

Dom4j: dom解析的升级版

Java通过sdk读取大华设备状态_List


来张图看看解析时如何分层

Java通过sdk读取大华设备状态_Java通过sdk读取大华设备状态_02

获取Document对象

SAXReader reader=new SAXReader();
	//读取xml文件
	 dom = reader.read("src/food.xml");

读取根节点

Dom.getRootElement()获取根节点

/**
	 * 解析根节点
	 */
	@Test
	public void test2() {
		//获取根节点
		Element root = dom.getRootElement();
		//根节点的名称
		System.out.println(root.getName());
		//获取根节点中的第一个属性,下标从0开始
		Attribute attr = root.attribute(1);
		//属性名
		System.out.println(attr.getName());
		//属性值
		System.out.println(attr.getValue());
		//根据属性名去获取属性
		Attribute a2 = root.attribute("id");
		System.out.println(a2.getValue());
		//直接获取属性的值
		String val = root.attributeValue("id");
		System.out.println(val+"====");
		//获取所有的属性
		List<Attribute> list =  root.attributes();
		for(Attribute a:list) {
			System.out.println(a.getName()+"=="+a.getValue());
		}
	}

读取子节点

/**
	 * 
	 * 解析子节点
	 */
	public void  test3() {
		//获取根节点
		Element root = dom.getRootElement();
		//获取子节点
		List<Element> list = root.elements();
		for(Element e:list) {
//			String val=e.attributeValue("des");
//			System.out.println(val);
			List<Attribute> att = e.attributes();
			for(Attribute a:att) {
				System.out.println(a.getName()+"==="+a.getValue());
			}
			
		}
	}

读取孙子节点

@Test
	public void test4() {
		//获取根节点
		Element root = dom.getRootElement();
		System.out.println(root.attributeValue("id"));
		//获取子节点
		List<Element> list1 = root.elements();
		for(Element e:list1) {
			System.out.println(e.attributeValue("des"));
			//子节点中的子节点  孙子节点
			List<Element> list2 = e.elements();
			for(Element ee:list2) {
				//获取节点中的文本
				System.out.print(ee.getText());
			}
			System.out.println();
		}
		
	}

DOM4J总结

获取属性:

Java通过sdk读取大华设备状态_java_03

获取根节点
getRootElement
子节点
elements()

确实不想用:节点树越深解析越复杂

XPath

Xpath(xml path language) xml路径表达方式,直接通过位置来访问节点信息

特点:通过表达式 对xml的全局定位 卫星定位

使用两个jar包

Java通过sdk读取大华设备状态_java_04


Dom4j只需要两个方法解决所有的问题

selectSingleNode() 获取单个节点
SelectNodes() 获取所有子节点

XPath表达式

链接: 学习网址.
点上面这个或者复制如下
https://www.w3school.com.cn/xpath/xpath_syntax.asp

Java通过sdk读取大华设备状态_System_05


Java通过sdk读取大华设备状态_System_06

案例1:获取根节点

**
	 * 获取根节点
	 */
	@Test
	public void test1() {
		Element element = (Element) dom.selectSingleNode("/food");
		System.out.println(element.getName());
		Attribute a=element.attribute(0);
		System.out.println(a.getName()+"=="+a.getValue());
	}

案例2://

/**
	 *   //找指定的节点
	 */
	@Test
	public void test2() {
		List<Node> list = dom.selectNodes("//name");
		for(Node n:list) {
			System.out.println(n.getText());
		}
	}

案例3:*

/**
	 *   *通配符
	 */
	@Test
	public void test3() {
		List<Node> list = dom.selectNodes("//caixi/*");
		for(Node n:list) {
			System.out.println(n.getText());
		}
	}

案例4:函数[last() ]

/**
	 * 函数last()   position()
	 */
	@Test
	public void test4() {
//		List<Node> list = dom.selectNodes("//caixi/name[last()]");
		//position()索引从1开始
		List<Node> list = dom.selectNodes("//caixi/name[position()=1]");
		for(Node n:list) {
			System.out.println(n.getText());
		}
	}

案例5:@ 含有属性

/**
	 *  @属性  找含有属性名的节点
	 */
	public void test5() {
		List<Node> list = dom.selectNodes("//caixi[@score]/name");
		for(Node n:list) {
			System.out.println(n.getText());
		}
	}

案例6:[normalize-space(@score)=‘85’]

根据属性名和属性值获取

/**
	 * 根据属性值去查找节点
	 * normalize-space(@score)='80'
	 */
	@Test
	public void test6() {
		List<Node> list = dom.selectNodes("//caixi[normalize-space(@score)='85']/name");
		for(Node n:list) {
			System.out.println(n.getText());
		}
	}

案例7:根据节点值去获取节点

/**
	 * 找到节点caixi中的price节点中含有小于30 的节点
	 */
	@Test
	public void test7() {
		List<Node> list = dom.selectNodes("//caixi[price<30]/name");
		for(Node n:list) {
			System.out.println(n.getText());
		}
	}