XML 定义
XML(EXtensible Markup Language):可扩展标记语言
- 标记,指的是一种标记语言,或者标签语言,即用一系列的标签来对数据进行描述
- 拓展,简单来说就是用户可以自己定义标签
- XML 是一种很象 HTML 的标记语言
- XML 的设计宗旨是传输数据,而不是显示数据
- XML 标签没有被预定义,需要自行定义标签
- XML 是W3C 的推荐标准
XML 和HTML 之间的差异
目的不同
- XML 被设计用来传输和储存数据,其焦点是数据的内容
- HTML 被设计用来显示数据,其焦点是数据的外观
XML 的特点
- XML 与操作系统、编程语言的开发平台无关
- 规范统一
XML 文档结构
XML 声明:用以表明该文件是一个XML文档
<?xml version="1.0" encoding="UTF-8"?>
XML 声明的组成部分,对于任何一个XML 文档,其声明部分都是固定的
- version: 文档符合XML1.0规范
- encoding: 文档字符编号,默认为“UTF-8”
XML 标签:用<>括起来的各种标签来标记数据,可以包含任意数量的标签
<标签名>标签描述的内容</标签名>
XML元素:由开始标签、元素内容和标签组成。
元素内容可以包含子元素、字符数据等
<元素名 属性名=“属性值”>元素内容</元素名>
XML 根元素
- 每个XML文档有且只有一个根元素
根元素的特点:
- 根元素是一个完全包括文档中其他所有元素的元素
- 根元素的开始标签要放在所有其他元素的开始标签之前
- 根元素的结束标签要放在所有其他元素的结束标签之后
XML属性
- 一个元素可以有多个属性,多个属性之间用空格隔开
- 属性只能放在开始标签中
- 属性值用双引号包裹,属性值中不能直接包含 < 、 “ 、&
<元素名 属性名=“属性值” 属性名=“属性值” >元素内容</元素名>
XML中的特殊字符的处理
XML文档中,有时在元素的文本中会出现一些特殊的字符(如<、>、’、”、&),为了正确的解析这些特殊字符内容,可以使用转义符和CDATA节。
XML 文档需要遵守以下规则:
- 必须有XML声明语句
- 必须有且只有一个根元素
- XML标签对大小写敏感
- XML标签成对出现
- XML元素正确的嵌套
- 元素名称可以包含字母、数字或其他的字符
- 元素名称不能以数字或者标点符号开始
- 元素名称中不能含空格
练习:
<?xml version="1.0" encoding="utf-8"?>
<members>
<member card="VIP1000">
<name>王者荣耀</name>
<password>000000</password>
<cord>1000</cord>
</member>
<member card="VIP1001">
<name>吃鸡</name>
<password>000000</password>
<cord>1000</cord>
</member>
</members>
四种常见的XML 解析技术
DOM4J
- DOM4J是 dom4j.org 出品的一个开源 XML 解析包
- Dom4J是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP
DOM4j的常用接口
DOM4J解析XML的步骤
练习:
public class Member {
private String card;
private String name;
private String password;
private int count;
public Member() {
}
public Member(String card, String name, String password, int count) {
this.card = card;
this.name = name;
this.password = password;
this.count = count;
}
@Override
public String toString() {
return "Member{" +
"card='" + card + '\'' +
", name='" + name + '\'' +
", password='" + password + '\'' +
", count=" + count +
'}';
}
public String getCard() {
return card;
}
public void setCard(String card) {
this.card = card;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
public class MemberDom4J {
//先创建一个空的Member集合,用来存储解析出来的每一个Member对象
List<Member> memberList = new ArrayList<>();
//解析XML文件
public void loadXml(String xmlPath) {
Document document = Dom4jUtil.createDocument(xmlPath);
if(document == null){
System.out.println("文档解析失败!");
return;
}
Member member = null;
//1.获取到根节点 members
Element rootElement = document.getRootElement();
//2.获取到根节点的所有子节点 每一个member元素
List<Element> memberEleList = rootElement.elements();
for (Element memberEle : memberEleList) {
//3.创建每一个member元素对应的Member对象
member = new Member();
//4.解析member元素的card属性值,并赋值给Member对象的card属性
member.setCard(memberEle.attributeValue("card"));
//直接从member元素中获取指定名称的子元素,如下面这个就是获取指定的name标签的文本内容,并赋值给Member的name属性
member.setName(memberEle.element("name").getText());
member.setPassword(memberEle.element("password").getText());
int count = 0;
try {
count = Integer.parseInt(memberEle.element("count").getText());
}catch (Exception e){}
member.setCount(count);
/*//5.解析member元素的所有子节点 name、password、count元素
List<Element> attrElementList = memberEle.elements();
for (Element attrEle : attrElementList) {
//6.获取member元素的子节点的元素名称/标签名称
String eleName = attrEle.getName();
//7.根据标签名称,将标签的文本内容赋值给对应的属性
switch (eleName){
case "name":
member.setName(attrEle.getText());
break;
case "password":
member.setPassword(attrEle.getText());
break;
case "count":
int count = 0;
try {
count = Integer.parseInt(attrEle.getText());
}catch (Exception e){}
member.setCount(count);
break;
}
}*/
//8.每解析玩一个member元素,就表示创建完了一个Member对象,将这个对象添加到事先准备好的集合中
memberList.add(member);
}
}
//添加一个Member对象
public void addMember(Member member){
Document document = Dom4jUtil.createDocument("files/xml/members.xml");
Element rootElement = document.getRootElement();
Element memberEle = rootElement.addElement("member");
memberEle.addAttribute("card",member.getCard());
memberEle.addElement("name").setText(member.getName());
memberEle.addElement("password").setText(member.getPassword());
memberEle.addElement("count").setText(member.getCount()+"");
saveXml(document,"files/xml/saveMember.xml");
}
//修改
public void updateMember(Member member){
Document document = Dom4jUtil.createDocument("files/xml/members.xml");
Element rootElement = document.getRootElement();
List<Element> memberEleList = rootElement.elements();
for (Element memberEle : memberEleList) {
if(memberEle.attributeValue("card").equals(member.getCard())){
memberEle.element("name").setText(member.getName());
memberEle.element("password").setText(member.getPassword());
memberEle.element("count").setText(member.getCount()+"");
break;
}
}
saveXml(document,"files/xml/updateMember.xml");
}
//删除
public void deleteMember(String card){
Document document = Dom4jUtil.createDocument("files/xml/members.xml");
Element rootElement = document.getRootElement();
List<Element> memberEleList = rootElement.elements();
for (Element memberEle : memberEleList) {
if(memberEle.attributeValue("card").equals(card)){
//rootElement.remove(memberEle);
memberEle.getParent().remove(memberEle);
break;
}
}
saveXml(document,"files/xml/deleteMember.xml");
}
//文档中含有中文
public void saveXml(Document document ,String savePath){
//1.创建XMLWriter对象
XMLWriter xmlWriter = null;
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
try {
xmlWriter = new XMLWriter(new FileWriter(savePath),format);
xmlWriter.write(document);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(xmlWriter!=null){
xmlWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void print() {
memberList.forEach(member -> {
System.out.println(member);
});
}
}
public class Test {
public static void main(String[] args) {
MemberDom4J dom4J = new MemberDom4J();
/*dom4J.loadXml("files/xml/members.xml");
dom4J.print();*/
/*Member member = new Member("VIP1003","QQ飞车","123456",1500);
dom4J.addMember(member);*/
/*Member member = new Member("VIP1001","绝地求生","000000",2500);
dom4J.updateMember(member);*/
dom4J.deleteMember("VIP1000");
}
}