记忆中的你:我们存储数据的方式的变化
变量—>数组–>对象---->对象数组---->集合—>文件操作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中本身就有特殊的含义,所以我们需要以特别的方式来进行展示他们。
> > greater than
< < less than
" "
' '
& &
四、了解解析器的概念
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);
}
}