二十六、XML

记忆中的你:我们存储数据的方式的变化
变量—>数组–>对象---->对象数组---->集合—>文件操作I/O(将数据持久化的储蓄在文件中)—>接下来就是我们要学习的XML了

一、理解XML概念和优势
1. XML:是eXtensible Markup Language 可扩展的标记的语言
例如:几乎没有提前订好的标签、元素、标记、需要你自己去编写一个,然后它就可以使用了
2.HTML:是Hyperter Markup Language 超文本标记语言
例如:#尖括号中的这些标记它是提前定义好的,我们是可以直接拿来用的。用它来实现某种效果
3. 标记语言的作用:
①可以用来做程序的小型数据库。(例如金山打字通中文章就是存储在我们的XML中的)
②可以作为数据交互使用。(例如微信登录和微信支付。微信会和你通过XML数据进行交互)
③可以用来配置应用程序‘
④XML还是AJAX的基石
二、会编写格式良好的XML文档

<?xml version="1.0" encoding="UTF-8"?>
<!--给上方的注释:
	<?xml?>声明 用来指定本XML文件中的一些信息,必须是在第一行
	属性:
		version:标注版本信息
		encoding:标注编码的信息 -->
<!-- 标记/标签 -->
<!--双标签:开放的标签-->
<!--跟标签:yige XML中必须有且仅有有一个根标签  -->

<books>
	<!-- 图书信息 -->
	<book id = "001">
		<bookName>西游记</bookName>
		<bookAuthor>吴承恩</bookAuthor>
		<decription>师徒四人去西天取经的故事</decription>
	</book>
	<book id="002">
		<bookName>钢铁是怎样炼成的</bookName>
		<bookAuthor>卡耐斯基</bookAuthor>
		<decription>坚强的保儿的生活的励志的故事</decription>
	</book>
<!-- 双标签:闭合标签 -->	
</books>

XML书写的注意格式:
①每一个XML标签都应该有对应的结束标签
要么就是双标签,要么就是自闭和标签,
②XML对大小写敏感,要严格进行的大写和小写的区分
③XML的嵌套要正确,同级标签要注意缩进
④XML的标签/元素名称,可以由字母数字,和符号组成。但是数字和.是不能开头的
⑤XML名称不能包含空格。否则在解析的时候,空格会被解析成其他的内容
⑥XML标签可以有多个属性,属性名推荐全部用小写,属性值应该以"“包裹起来,属性值不允许出现< >”" " & . 等

三、了解XML中特殊字符的处理方式
因为有一些特殊的字符。在XML中本身就有特殊的含义,所以我们需要以特别的方式来进行展示他们。

>      &gt;       greater  than
<      &lt;         less     than
"      &quot;
'      &apos; 
&  		&amp; 

四、了解解析器的概念
DOM:基于XML文档树结构
SAX:基于事件的解析
DOM4J:非常优秀的解析器
五、理解DOM树节点构造
DOM(Domcument Object Model)解析,会将XML内容加载到内存中,并绘制对应的DOM树,DOM树中,我们将标签称为元素的节点,将属性称为是属性的节点,将文本称为是文本的节点,
节点和元素的关系,节点是包含元素‘
六、使用DOM解析XML文件
XML文件如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><students>
	<student id="001">
		<name>王明轩</name>
		<hopeSocre>75</hopeSocre>
		<getScore>80</getScore>
	</student>
	<student id="002">
		<name>韩一群</name>
		<hopeSocre>75</hopeSocre>
		<getScore>80</getScore>
	</student>
</students>

用DOM解析后的XML文件
其中在得到查看XML文件中的元素有俩种方法,一种是直接获取元素,比较方便点,另一种是先获取根元素,在获取子元素,一级一级的获取,大家觉得那个好用就用那个

package test;

import java.io.File;

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

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

/**
 * 将XML文件解析为DOM文件进行对XML文件的增删该查
 * @author xiaobubu
 *2019年3月10日下午1:27:23
 */
public class DOMParseStudent {
	//创建成员变量
	private Document document;
	
	/**
	 * 解析XML来得到Document对象(在内存中加载DOM树)
	 * 无需理解固定步骤,目的就是为课获取XML的Document对象
	 * @throws ParserConfigurationException 
	 */
	private void getXMLdocment() throws Exception {
		//1.创建工厂解析器对象
		DocumentBuilderFactory newInstance = DocumentBuilderFactory.newInstance();
		//2.解析器工厂对象来创建解析器
		DocumentBuilder documentBuilder = newInstance.newDocumentBuilder();
		//3.解析器对象来解析自己的XML文件,生成Document对象,传入
		document= documentBuilder.parse(new File("src/student.xml"));
	}
	

	/**
	 * 利用document对象  查看XML文件中的所有的内容
	 * 
	 */
	
	public  void getXMLcontent() {
		//1.根据标签名获取标签或者是元素节点
		NodeList studentsNodeList = document.getElementsByTagName("students");
		//2.获取根节点
		Node studentsNode = studentsNodeList.item(0);
		//3.通过根节点来获取其他的子节点的集合
		NodeList childNodes = studentsNode.getChildNodes();
		
		//获取节点集合的长度,现在他里面包含的文本节点和注释节点的和空格节点,元素节点
		//System.out.println(childNodes.getLength());
		//通过遍历节点集合的元素来获取到相应的元素
		for(int i=0;i<childNodes.getLength();i++) {
			//获取到第i个节点
			Node node = childNodes.item(i);
			//判断节点是否是元素类型
			if(node instanceof Element) {
				//如果节点是元素类型,就进行对元素节点的操作
				//节点中包含元素,所以将节点转换为元素方便操作
				Element studentsEle = (Element)node;
				String id = studentsEle.getAttribute("id");
				System.out.println("手机的编号是:"+id);
				
				//获取所有student的子节点的集合
				NodeList studentchildNodes = studentsEle.getChildNodes();
				//遍历子节点的集合
				for(int j=0;j<studentchildNodes.getLength();j++) {
					Node item = studentchildNodes.item(j);
					//判断每个节点是不是元素类型
					if(item instanceof Element) {
						//这样就得到了student的子元素,将节点转换为元素类型
						Element studentChild = (Element)item;
						//获取元素中的内容
						String textContent = studentChild.getTextContent();
						System.out.println(studentChild.getTagName()+":"+textContent);
						
					}
				}
				System.out.println("****************************");
			}
			
		}
	}
	
	
	
	
	
	/*
	public void getXMLcontent() {
		//获取所有的student元素集合
		NodeList studentNodes = document.getElementsByTagName("student");
		for(int i=0;i<studentNodes.getLength();i++) {
			Node studentNode = studentNodes.item(i);
			Element studentEle = (Element)studentNode;
			String attribute = studentEle.getAttribute("id");
			System.out.println("id:"+attribute);
			NodeList studentChileNodes = studentEle.getChildNodes();
			for(int j=0;j<studentChileNodes.getLength();j++) {
				Node studentChildNode = studentChileNodes.item(j);
				if(studentChildNode.getNodeType()==Node.ELEMENT_NODE) {
					Element studentChildEle = (Element)studentChildNode;
					String tagName = studentChildEle.getTagName();
					String textContent = studentChildEle.getTextContent();
					System.out.println(tagName+":"+textContent);
				}
			}
			System.out.println("*********************");
		}
		
	}*/
	
	/**
	 * 程序入口哦
	 * @param args
	 */
	public static void main(String[] args) {
		//创建DOMParseStudent对象
		DOMParseStudent domParseStudent = new DOMParseStudent();
		
		try {
			//1.得到XML文件对象
			domParseStudent.getXMLdocment();
			//2.查看XML的文件内容
			domParseStudent.getXMLcontent();
			//3.添加元素到XML中
			domParseStudent.addXMLContent();
			//4.将你在内存中对XML文件的一系列操作保存到文件中,
			//否则没有任何改动的效果
			domParseStudent.saveXML();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

		
	


	/**
	 * 保存XML到文件中
	 * @throws Exception 
	 * 
	 */
	public void saveXML() throws Exception {
		//1.创建转换器工厂对象
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		//2.转换器工厂生产转换器
		Transformer transformer = transformerFactory.newTransformer();
		//3.指定数据源
		DOMSource domSource = new  DOMSource(document);
		//4.指定输出目的地
		StreamResult streamResult = new StreamResult(new File("src/student.xml"));
		//5.指定输出格式
		transformer.setOutputProperty("encoding", "UTF-8");;
		//6.进行输出
		transformer.transform(domSource, streamResult);
	}


	/**
	 * 添加内容到XML文件中
	 */
	public  void addXMLContent() {
		
		//1.创建student元素
		Element studentEle = document.createElement("student");
		//2.给元素赋值
		studentEle.setAttribute("id", "003");
		//3.创建元素下的三个子元素
		Element nameEle = document.createElement("name");
		nameEle.setTextContent("杜亮");
		Element hopeSocreEle = document.createElement("hopeSocre");
		hopeSocreEle.setTextContent("12000");
		Element getScoreEle = document.createElement("getScore");
		getScoreEle.setTextContent("369");
		
		//4.将四个元素放到student下
		studentEle.appendChild(nameEle);
		studentEle.appendChild(hopeSocreEle);
		studentEle.appendChild(getScoreEle);
		//5.将student元素放到students下
		Node studentsNode = document.getElementsByTagName("students").item(0);
		studentsNode.appendChild(studentEle);
		
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44614066/article/details/88387806