写在前面: 这篇文章介绍XML的语法以及使用,还有使用java解析xml。
希望能够对大家有所帮助,点赞支持是我最大的动力!
作者公众号:小白编码
本文目录
XML是什么?
- XML 指可扩展标记语言(EXtensible Markup Language)
- XML 是一种标记语言,很类似 HTML
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准
XML 与 HTML 的主要差异
XML 不是 HTML 的替代。
XML 和 HTML 为不同的目的而设计:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
html 标签:
格式:<标签名>封装的数据</标签名>
单标签: <标签名/> <br /> 换行<hr />水平线
双标签<标签名>封装的数据</标签名>
标签名大小写不敏感
标签有属性,有基本属性和事件属性
标签要闭合(不闭合,html 中不报错。但我们要养成良好的书写习惯。闭合)
xml 的主要作用有:
1、用来保存数据,而且这些数据具有自我描述性
2、它还可以做为项目或者模块的配置文件
3、还可以做为网络传输数据的格式(现在JSON 为主)。
xml 语法
- 文档声明。
- 元素(标签)
- xml 属性
- xml 注释
- 文本区域(CDATA 区)
属性:
version 是版本号
encoding 是xml 的文件编码
standalone=“yes/no” 表示这个xml 文件是否是独立的xml 文件
xml格式:
<?xml version="1.0" encoding="UTF-8"?>
<!--这个<?xml 要连在一起写,否则会有报错-->
<!-- xml 声明version 是版本的意思encoding 是编码-->
<books> <!-- 这是xml 注释-->
<book id="SN123123413241">
<!-- book 标签描述一本图书id 属性描述的是图书的编号-->
<name>java从入门到放弃</name>
<!-- name 标签描述的是图书的信息-->
<author>codwhite</author>
<!-- author 单词是作者的意思,描述图书作者-->
<price>999</price>
<!-- price 单词是价格,描述的是图书的价格-->
</book>
</books>
XML语法规则:
- XML 开头声明
<?xml version="1.0" encoding="UTF-8" ?>
<!-- xml 声明version 是版本的意思encoding 是编码-->
- XML 文档必须有根元素
<!--必须有一个根元素,可以根据自身要求定义-->
<root>
<book>
<name>java从入门到放弃</name>
</book>
</root>
- 所有的 XML 元素都必须有一个关闭标签
<name>java从入门到放弃</name>
<!--</name>就是一个关闭标签-->
错误写法:
<name>java从入门到放弃
- XML 标签对大小写敏感
<Name>java从入门到放弃</name>
<!--不能这样声明,否则报错-->
正确写法:
<name>java从入门到放弃</name>
- XML 必须正确嵌套
正确的嵌套:
<book>
<name>java从入门到放弃</name>
</book>
错误的嵌套:
<name>
<book>java从入门到放弃</name>
</book>
- XML 属性值必须加引号
xml 的标签属性和html 的标签属性是非常类似的,属性可以提供元素的额外信息在标签上可以书写属性:一个标签上可以书写多个属性。每个属性的值必须使用引号引起来。
正确属性值写法:
<book id="SN123123413241">
<name>java从入门到放弃</name>
</book>
错误属性值写法:
<book id=SN123123413241>
<name>java从入门到放弃</name>
</book>
- XML 中的注释
<!--这个就是XML注释-->
- 实体引用
在 XML 中,一些字符拥有特殊的意义。
如果您把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。
这样会产生 XML 错误:
错误写法:
<message>if salary < 1000 then</message>
用实体引用来避免错误:(<代表<)
<message>if salary < 1000 then</message>
在 XML 中,有 5 个预定义的实体引用:
< | < | less than |
---|---|---|
> | > | greater than |
& | & | ampersand |
' | ’ | apostrophe |
" | " | quotation mark |
- XML标签名称不能以数字或者标点符号开始
错误写法:
<1book id="SN123123413241"/>
- 名称不得包含空格
<b ook id="SN123123413241"/>
- XML中的单标签与双标签
单标签
格式: <标签名属性=”值” 属性=”值” ...... />
<book id="SN123123413241"/>
双标签
<book id=SN123123413241></book>
格式:< 标签名属性=”值” 属性=”值” ......>文本数据或子标签</标签名>
文本区域(CDATA 区)
CDATA 语法可以告诉xml 解析器,我CDATA 里的文本内容,只是纯文本,不需要xml 语法解析
CDATA 格式:
<![CDATA[ 这里可以把你输入的字符原样显示,不会解析xml ]]>
Dom4j 解析技术
dom4j 编程步骤:
首先需要dom4j库:
第一步: 先加载xml 文件创建Document 对象
第二步: 通过Document 对象拿到根元素对象
第三步: 通过根元素.elelemts(标签名); 可以返回一个集合,这个集合里放着。所有你指定的标签名的元素对象
第四步: 找到你想要修改、删除的子元素,进行相应在的操作
第五步: 保存到硬盘上
①需要解析的books.xml 文件内容
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book sn="SN12341232">
<name>JAVA从入门到放弃</name>
<price>9.9</price>
<author>小白</author>
</book>
<book sn="SN12341231">
<name>Mysql从删库到跑路</name>
<price>99.99</price>
<author>codewhite</author>
</book>
</books>
②创建javabean(books)
//get,set,构造器,tostring自行添加
public class Book {
private String sn;
private String name;
private Double price;
private String author;
}
③解析获取Document 对象的代码
第一步,先创建SaxReader
对象。这个对象,用于读取xml 文件,并创建Document
/*
* dom4j 获取Documet 对象
*/
@Test
public void testGetDocument() throws DocumentException {
// 要创建一个Document 对象,需要我们先创建一个SAXReader 对象
SAXReader reader = new SAXReader();
// 这个对象用于读取xml 文件,然后返回一个Document。
Document document = reader.read("src/books.xml");
// 打印到控制台,看看是否创建成功
System.out.println(document);
}
④遍历标签获取所有标签中的内容
需要分四步操作:
第一步,通过创建SAXReader对象
。来读取xml 文件
,获取Document 对象
第二步,通过Document 对象
。拿到XML 的根元素对象Element
第三步,通过根元素对象
。获取所有的book 标签对象
第四步,遍历每个book 标签
对象。然后获取到book 标签对象内的每一个元素,再通过getText() 方法拿到起始标签和结束标签之间的文本内容
/*
* 读取xml 文件中的内容
*/
@Test
public void readXML() throws DocumentException {
// 第一步,通过创建SAXReader 对象。来读取xml 文件,获取Document 对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/books.xml");
// 第二步,通过Document 对象。拿到XML 的根元素对象
Element root = document.getRootElement();
// 第三步,通过根元素对象。获取所有的book 标签对象
// Element.elements(标签名)它可以拿到当前元素下的指定的子元素的集合
List<Element> books = root.elements("book");
// 第四步,遍历每个book 标签对象。然后获取到book 标签对象内的每一个元素,
for (Element book : books) {
// 打印测试
// Element.asXML() 它将当前所有元素转换成为String 对象
// System.out.println( root.asXML() );
// 拿到book 下面的name 元素对象
Element nameElement = book.element("name");
// 拿到book 下面的price 元素对象
Element priceElement = book.element("price");
// 拿到book 下面的author 元素对象
Element authorElement = book.element("author");
// 再通过getText() 方法拿到起始标签和结束标签之间的文本内容
System.out.println("书名:" + nameElement.getText() + " , 价格:"
+ priceElement.getText() + ", 作者:" + authorElement.getText());
}
}
结果演示:
案例2:
@Test
public void test2() throws Exception {
//读取books.xml文件
SAXReader saxReader = new SAXReader();
//2.通过Document对象获得根元素
Document document = saxReader.read("src/books.xml");
Element rootElement = document.getRootElement();
System.out.println(rootElement);
//3.通过根元素获取book标签对象
//element和lement都是通过标签名查找子元素
List<Element> books = rootElement.elements("book");
for (Element book : books) {
// Element.asXML() 它将当前所有元素转换成为String 对象
// System.out.println( root.asXML() );
// Element.element(标签名)拿到当前元素下子元素
Element elementName = book.element("name");
//getText 可以将获取标签中的文本内容
String nameText = elementName.getText();
System.out.println(nameText);
//或者用elementTest("标签名")直接获取标签名的文本内容
String priceText = book.elementText("price");
String authorText = book.elementText("author");
String snValue = book.attributeValue("sn");
System.out.println(new Book(snValue, nameText, Double.parseDouble(priceText), authorText));
}
}
结果演示:
写在后边:
本文学习资料来源于:百度百科,菜鸟教程,尚硅谷教程等。
如果有问题可以联系我。