第二章XML

XML简介

在这里插入图片描述

XML的文档结构

在这里插入图片描述
1.XML声明
在这里插入图片描述
2.XML标签
在这里插入图片描述
3.元素
元素由开始标签,结束标签和元素内容组成。元素内容指开始标签和结束标签之间的内容,可以包含子元素,字符数据等。
元素的命名规则如下

  • 名称中可以包含字母数字,或者其他符号。
  • 名称不能一数字或标点符号开始是。
  • 名称不能以字符“”XML“(或者XML,XmL)开始。
  • 名称不能包含空格

4.根元素
根元素的特点

  • 根元素是一个完全包括文档中其他所有元素的元素。
  • 根元素的起始标签要放在所有其他元素的起始标签之前。
  • 根元素的结束标签要放在所有其他元素的结束标签之后。

5.属性
6.xml中的特殊字符的处理
在这里插入图片描述
7.文档要求
在这里插入图片描述

XMl的应用

xml的应用场景主要体现在以下几点
1.数据存储
2.数据交换
3.数据配置

XML解析

目前常用的解析技术有四种

1.DOM

DOM把XML文件映射成一颗倒挂的数,已根元素为根节点,每一个节点都已对象形式存在,通过存取这些对象就能存取XML文档的内容
在这里插入图片描述
DOM树结构

使用DOM 读取XML数据

解析xml文件的步骤

   /*
   解析XML文件
   */
    //创建解析器工厂对象
	DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
	//获得解析对象
	DocumentBuilder builder=factory.newDocumentBuilder();
	//加载要解析的XML文件
	Document doc=builder.parse(new File("手机信息.xml"));//构建DOM树
	//操作DOM树: 读取,修改,添加,删除..
	
	/*
	getLength():获得节点个数
	Item():获得节点集合中的第N个节点
	getElementsByTagName(): 根据标签名获得指定的标签[子标签,父标签]
	getAttribute((): 获得当前标签的指定属性的值
	getTextContent(): 获得当前标签的文本内容
	/*
	
	NodeList brands=doc.getElementsByTagName("Brand");//根据标签名获得标签节点
	for (int i = 0; i < brands.getLength(); i++) {
		//节点: 标签,属性节点,文本节点
		Element brand=(Element) brands.item(i);//Brand属于标签节点
		String name=brand.getAttribute("name");
		//el.getChildNodes();
		NodeList types=brand.getElementsByTagName("Type");
		for(int j = 0; j < types.getLength(); j++) {
			Element type=(Element) types.item(j);//Node向下转型为Element
			String typeName=type.getAttribute("name");//获得type标签的name属性值
			String price=type.getTextContent();//获得当前标签的文本内容
			System.out.println("手机名:"+name+" 型号:"+typeName+" 价格:"+price);
				}
			}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用DOM维护XML数据

    //创建解析器工厂对象
	DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
	//获得解析对象
	DocumentBuilder builder=factory.newDocumentBuilder();
	//加载要解析的XML文件
	Document doc=builder.parse(new File("手机信息.xml"));//构建DOM树
	
	//新增节点: 标签节点,属性节点,文本节点
	Element newBrand=doc.createElement("Brand");//<Brand></Brand>
	newBrand.setAttribute("name", "小米");//<Brand name="小米"></Brand>
	
	Element newType=doc.createElement("Type");//<Type></Type>
	newType.setAttribute("name", "Mi10");//<Type name="Mi10"></Type>
	newType.setTextContent("2999元");//<Type name="Mi10">2999元</Type>
	//将子标签添加到父标签中
	newBrand.appendChild(newType);//<Brand name="小米"><Type name="Mi10">2999元</Type></Brand>
	
	//修改节点: 属性,文本
	newType.setAttribute("name","mi11");
	newType.setTextContent("1999元");
	
	//删除节点: 标签节点,属性节点,文本节点
	newType.removeAttribute("name");
	newType.setTextContent("");//文本默认为""
	//newType.getParentNode().removeChild(newType);//删除当前节点
	Node parentNode=newType.getParentNode();
	parentNode.removeChild(newType);
	
	//添加节点到DOM树
	doc.getElementsByTagName("PhoneInfo").item(0).appendChild(newBrand);
	
	//存储XML信息
	DOMSource domSource=new DOMSource(doc);//设置DOM信息
	Result rs=new StreamResult(new FileOutputStream(new File("新的手机信息.xml")));//信息存储位置
	
	//格式转换对象
	//创建格式转换工厂对象
	TransformerFactory ttf=TransformerFactory.newInstance();
	//获得格式转换对象
	Transformer transformer=ttf.newTransformer();
	//设置转换格式
	transformer.setOutputProperty(OutputKeys.VERSION, "1.0");
	transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
	//转换: 将DOM信息,转到磁盘文件中
	transformer.transform(domSource, rs);

2.SAX

SAX是基于时间的解析,他是解决DOM解析的资源消耗而出现的,它不像DOM那样需要建立一颗完整的文档树,而是通过时间处理器完成对文档的解析, 以为SAX解析不用事先调入整个文档,所以他的优势就是占用资源少,消耗内存小,一般在解析数据量大的XML文档是会采用。
在这里插入图片描述

3.JDOM

在这里插入图片描述

4.DOM4J

在这里插入图片描述
在这里插入图片描述

使用DOM4j解析XML

在这里插入图片描述
在这里插入图片描述

    //创建解析器
	SAXReader saxReader=new SAXReader();
	//加载指定XML文件
	Document doc=saxReader.read("手机信息.xml");
	//获得根标签
	Element root=doc.getRootElement();
	
	//解析XML信息
	System.out.println(doc.asXML());
	/*List<Element> brands=root.elements("Brand"); 
	for (Element element : brands) {
		//element.attribute("name").getValue();
		String name=element.attributeValue("name");
		
		List<Element> types=element.elements("Type");
		for (Element type : types) {
			String typeName=type.attributeValue("name");
			String price=type.getTextTrim();
			System.out.println("品牌:"+name+" 类型:"+typeName+" 价格:"+price);
		}
	}*/
	
	//添加节点:
	Element newBrand=root.addElement("Brand");//<Brand></Brand>
	newBrand.setAttributeValue("name", "小米");//<Brand name="小米"></Brand>
	Element newType=newBrand.addElement("Type");//<Brand name="小米"><Type></Type></Brand>
	newType.setAttributeValue("name", "mi10");//<Brand name="小米"><Type name="mi10"></Type></Brand>
	newType.setText("1999元");//<Brand name="小米"><Type name="mi10">1999元</Type></Brand>
	
	//修改节点:
	newType.setAttributeValue("name", "mi11");
	newType.setText("3999元");
	//newBrand.remove(newType);
	newType.getParent().remove(newType);
	
	//删除节点:
	newType.remove(newType.attribute("name"));
	newType.setText("");//remove(Text对象);
	
	OutputFormat format=OutputFormat.createPrettyPrint();
	format.setEncoding("UTF-8");
	XMLWriter  xmlWriter=new XMLWriter(new FileOutputStream("新手机信息.xml"), format);
	xmlWriter.write(doc);
	xmlWriter.close();

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

XML总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值