一、XML简介
1. 简介
XML是可扩展标记语言,标准通用标记语言的字节,是一种用于标记电子文件使其具有结构性的标记语言
XML主要用于传输数据,而不是显示数据,XML标签没有被预定义,需要自行定义,XML遵循W3C的推荐标准,具有自我描述性
2. 案例
<?xml version="1.0" encoding="utf-8"?>
<!--
xml的声明标题
version表示xml的版本
encoding表示编码
-->
<books>
<book id="100001">
<name>红楼梦</name>
<author>曹雪芹</author>
<price>49.9</price>
</book>
<book id="100002">
<name>西游记</name>
<author>吴承恩</author>
<price>48.9</price>
</book>
<book id="100003">
<name>水浒传</name>
<author>施耐庵</author>
<price>50.9</price>
</book>
<book id="100004">
<name>三国演义</name>
<author>罗贯中</author>
<price>45.9</price>
</book>
</books>
3. XML解决的问题
- xml可以解决程序间数据的传输问题,都使用xml格式会易读、可维护
- xml可以用来做配置文件,很多xml格式的文件都被用作项目的配置文件
- xml甚至可以作为小型的数据库,将数据直接存储在文件中,直接读取该文件获取配置
二、XML语法
1. XML包含以下几个部分
- 文档声明
- 元素
- 属性
- 注释
- CDATA区、特殊字符等
2. 注释
<!--xml注释-->
3. 元素
语法要求:
- 每个XML文档有且只有一个根元素
- 根元素包含其他所有元素
- 元素标签是可以嵌套的
- 元素名称区分大小写,不能以数字开头,不能包含空格和冒号
- 标签的属性值需要用双引号或单引号分割
- 一个元素可以有多个属性值,属性值不能包括&符号
<Student ID="100">
</Student>
4. CDATA节
当有些内容不想被解析引擎执行,而是展示原始内容,可以使用CDATA包起来,这样CDATA中间的文本会直接展示出来
<![CDATA[文本内容]]>
<?xml version="1.0" encoding="utf-8"?>
<foods>
<food>
<![CDATA[
<meal>
</meal>
]]>
</food>
</foods>
5. 常用的转义字符
例子:
<?xml version="1.0" encoding="utf-8"?>
<foods>
<food>
<!--
年龄 < 50 这样会报错
-->
年龄 < 50岁
</food>
</foods>
三、DOM4j
不管是html还是xml都是标记型文档,都可以用w3c组织指定的dom技术来解析
Dom4j是一个Java库,用于处理xml文件,是一次性把xml文件读取到内存中,读取xml文件时,必须一层一层的进行读取,不能直接读取某一个标签
看看如何解析xml文件,可以按照如下的格式放入文件
Dom4j jar包下载地址:Central Repository: dom4j/dom4j (maven.org)
test_parse文件是需要被转话的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>
<number>0001</number>
<bookName>人类简史</bookName>
<price>99.9</price>
</book>
<book>
<number>0002</number>
<bookName>解放战争</bookName>
<price>79.9</price>
</book>
</books>
1)解析元素,下面是Java code:
package com.oliver;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class TestParseXML {
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("xmls\\test_parse.xml"));
Element rootElement = document.getRootElement();
List<Element> books = rootElement.elements("book");
for (Element book:books){
Element number = book.element("number");
Element bookName = book.element("bookName");
Element price = book.element("price");
System.out.println("number = " + number.getText() + "\nbookName = " + bookName.getText() + "\nprice = " + price.getText());
}
}
}
看一下效果,打印了一些warning和有用的book信息:
2)添加一个book元素:
package com.oliver;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.*;
import java.util.List;
public class TestParseXML {
public static void main(String[] args) throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("xmls\\test_parse.xml"));
Element new_book = DocumentHelper.createElement("book");
new_book.addAttribute("id","03");
Element new_book_number = DocumentHelper.createElement("number");
Element new_book_name = DocumentHelper.createElement("name");
Element new_book_price = DocumentHelper.createElement("price");
new_book_name.setText("黄金时代");
new_book_number.setText("0003");
new_book_price.setText("39.9");
new_book.add(new_book_number);
new_book.add(new_book_name);
new_book.add(new_book_price);
Element rootElement = document.getRootElement();
rootElement.add(new_book);
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("xmls\\test_parse.xml")));
writer.write(document);
writer.close();
}
}
最终得到的效果如下:
3)删除某一个元素:
package com.oliver;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.*;
import java.util.List;
/**
* @author :16140
* @description :
* @create :2023-09-20 21:08:00
*/
public class TestParseXML {
public static void main(String[] args) throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("xmls\\test_parse.xml"));
Element rootElement = document.getRootElement();
Element book = (Element) rootElement.elements("book").get(2);
book.getParent().remove(book);
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("xmls\\test_parse.xml")));
writer.write(document);
writer.close();
}
}
最终效果:
4)更新一个元素:
package com.oliver;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.*;
import java.util.List;
public class TestParseXML {
public static void main(String[] args) throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("xmls\\test_parse.xml"));
List<Element> books = document.getRootElement().elements("book");
for(Element book: books){
Element price = book.element("price");
price.setText((Integer.parseInt(price.getText()) + 3) + "");
}
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");//输出的编码 utf-8
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("xmls\\test_parse.xml")));
writer.write(document);
writer.close();
}
}