XML技术

一、XML简介

1、XML是可扩展标记语言
2、与操作系统和操作平台均无关
3、规范统一,支持异构系统
在这里插入图片描述

二、XML文档结构

在这里插入图片描述

1、XML声明

<?xml version="1.0" encoding="UTF-8" ?> 注意:这里需要修改的encoding,如果出现乱码,需要改成GBK

2、标签
元素名 元素属性名=“属性值” 元素内容
在这里插入图片描述

3、根元素
写在声明下面的标签元素,有且只有一个根元素
4、属性
一个元素可以有多个属性,多个属性之间用空格分开

注意:属性可以加在任何一个元素的其实标签上,但不能加在结束标签上,且不能包含特殊字符< " .&

5、特殊字符的处理
在这里插入图片描述

四、XML编写注意事项

在这里插入图片描述

五、XML命名空间

命名空间是在解析XML文档时,对于重名的元素,可能出现解析冲突,他们用来标识来自特定域(标准组织、公司、行业)的名称
除非带有前缀,否则属性属于他们的元素所在的命名空间

六、验证XML文档

DTD验证

七、DOM解析XML

1、步骤

(1)创建解析器工厂

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
(2)创建解析器
DocumentBuilder builder =factory.newDocumentBuilder();
(3)获得Document
document=builder.parse("src/info.xml");
(4)创建解析器工厂

以Document对象为起点对DOM树的节点进行增加、删除、修改查询等操作

2、关键代码(包含增删该查操作)

package demo1;

import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Test1 {
	private Document document;
	
	/** * 创建Document对象 * @throws IOException * @throws Exception */
	public void getDoc() throws Exception, IOException {
		//解析器工厂
		DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
		//创建解析器
		DocumentBuilder builder =factory.newDocumentBuilder();
		//获得Document
		document=builder.parse("src/info.xml");
	}
	
	
	/** * 保存XM * @throws Exception */
	public void save() throws Exception {
		TransformerFactory factory =TransformerFactory.newInstance();
		factory.setAttribute("indent-number", 4);//天假空白
		Transformer transformer=factory.newTransformer();
		//设置格式
		transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
		transformer.setOutputProperty(OutputKeys.INDENT, "YES");
		DOMSource xmlSource =new DOMSource(document);
		StreamResult outputTarget =new StreamResult(new FileOutputStream("src/info.xml"));
		transformer.transform(xmlSource, outputTarget);
	}
	
	/** * 增加新手机节点 * @throws Exception */
	public void add() throws Exception {
		getDoc();
		Element eleBrand=document.createElement("Brand");
		eleBrand.setAttribute("name", "小米手机");
		//获得根元素
		Element root=(Element) document.getElementsByTagName("PhoneInfo").item(0);
		root.appendChild(eleBrand);
		save();
	}
	
	/** * 修改 * @throws Exception * @throws IOException */
	public void change() throws IOException, Exception {
		getDoc();
		NodeList brands = document.getElementsByTagName("Brand");
		for (int i = 0; i < brands.getLength(); i++) {
			Node brandNode=brands.item(i);
			Element eleBrand =(Element) brandNode;
			String brandName =  eleBrand.getAttribute("name");
			if(brandName.equals("苹果")) {
				eleBrand.setAttribute("name", "apple");
				save();
			}
		}
	}
	/** * 删除 * @throws Exception * @throws IOException */
	public void delate() throws Exception, Exception {
		getDoc();
		NodeList brands = document.getElementsByTagName("Brand");
		for (int i = 0; i < brands.getLength(); i++) {
			Node brandNode=brands.item(i);
			Element eleBrand =(Element) brandNode;
			String brandName =  eleBrand.getAttribute("name");
			if(brandName.equals("苹果")) {
				eleBrand.getParentNode().removeChild(eleBrand);
				save();
			}
		}
	}
	
	/** * 显示 * @throws Exception * @throws IOException */
	public void show() throws IOException, Exception {
		getDoc();
		//获得brand节点
		NodeList brands=document.getElementsByTagName("Brand");
		for (int i = 0; i < brands.getLength(); i++) {
			Node brandNode =brands.item(i);
			Element eleBrand =(Element) brandNode;
			System.out.println(eleBrand.getAttribute("name"));
			//获得brand下的子节点
			NodeList types=eleBrand.getChildNodes();
			for (int j = 0; j < types.getLength(); j++) {
				Node typeNode=types.item(j);
				if(typeNode.getNodeType()==Node.ELEMENT_NODE) {
					Element eleType = (Element) typeNode;
					System.out.println("\t"+eleType.getAttribute("name"));
				}
			}
			
		}
	}
	
	public static void main(String[] args) throws IOException, Exception {
		Test1 t = new Test1();
		t.show();
		t.add();
		t.change();
		t.delate();
	}
}

3、注意区别这几个关键词

Document:

可操作整个DOM树

Node

代表节点(节点又分为元素节点、文本节点),其中元素节点又叫标签节点,是带有尖括号的,换行在XML中也被认为是节点

Element

元素节点,是Node的一个子类

Atteabute

凡是对属性进行操作的

item

从NodeList中获得Node,要通过循环遍历