XML
说明:
xml是一种扩展性的标记语言,关注数据本身。
作用:
1、数据存储、数据描述、数据交互
2、配置文件 (web项目的web.xml文件、spring框架的spring.xml等)
要求:
文档的后缀名是 xml
每个文档有且仅有一个根元素,所谓根元素就是包含了其他所有元素的元素。
XML 目前只有一个版本,即 1.0.XML 是自描述数据,使用现有的国际标准。
语法规范:
1) 必须有 xml 文档声明
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<? 表示文档的开始
xml 表示当前是xml文档
?> 表示文档的结束
version 表示xml文档的版本,目前只有1.0
encoding 表示文档的编码格式
standalone 表示文档是否独立存在
注:文档声明必须写在xml文件中的第一行,顶格写,不能出现空格和换行。
2) 必须有且仅有一个根元素
3) 严格区分大小写
4) 属性值用引号(双引号或单引号) :等号分开的名称-值对;在一个元素上,相同的属性只能出现一次
5) 标记成对;
6) 空标记关闭;
7) 元素正确嵌套。
元素命名规则:
1) 名称中可以包含字母、数字或者其他可见字符;
2) 名称不能以数字开头;
3) 不能以 XML/xml/Xml…开头;
4) 名称中不能含空格;
5) 名称中不能含冒号(注:冒号留给命名空间使用)
实体:
实体叫 ENTITY,实体的作用是避免重复输入。作用相当于宏或者变量。
1) 内置的 5 种实体
实体 符号
< <
> >
& &
" "
' '
2) 自定义实体
<!DOCTYPE 根元素[
<!ENTITY 实体名 "实体内容">
]>
2) 使用实体
&实体名;
文档类型声明:
文档类型定义——DOCTYPE,文档类型声明,紧跟 XML 声明之后,包含所有实体声明
构成:
1、元素
2、属性
3、实体
4、PCDATA
被解析的字符数据(被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 的内置实体来分别替换它们。)
5、CDATA
用于把整段文本解释为纯字符数据而不是标记的情况。如包含大量的<、>、&、或者" 字符。
CDATA 节中的所有字符都会被当做元素字符数据的常量部分,而不是 XML 标记,可以输入除]]>外任意字符,不能嵌套。
格式:
<![CDATA[ ...... ]]>
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!-- 自定义实体-->
<!DOCTYPE people[
<!-- 定义实体 -->
<!ENTITY xb "男" >
<!ENTITY nl "18" >
]>
<people>
<person sex='1' id="1">
<name>张三</name>
<age>&nl;</age>
<height>&</height>
</person>
<person sex="0">
<name>李四</name>
<age>19</age>
<usex>&xb;</usex>
<desc><![CDATA[战国时期,芈月是楚威王最宠爱的<小公主,但<desc>在楚威王
死后生活一落千丈,母亲向氏被楚威后逐出宫,芈月&弟弟芈戎躲过了一次次灾难和危机。
芈月与楚公子黄歇青梅竹马,真心相爱,但被作为嫡公主芈姝的陪嫁>媵侍远嫁秦国。芈姝当
上了秦国的王后,芈月不得已成为宠妃...]]></desc>
</person>
</people>
用DOM解析:
① 建 立 DocumentBuilderFactory : DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
② 建立 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder();
③ 建立 Document : Document doc = builder.parse(“要解析的文件路径”);
④ 建立 NodeList : NodeList nl = doc.getElementsByTagName(“读取节点”);
⑤ 进行 XML 信息读取
public class DomParser02 {
public static void main(String[] args) {
try {
// 建 立 DocumentBuilderFactory解析工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 建立 DocumentBuilder解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析xml文件,得到Document对象
Document document = builder.parse("src/day01-test.xml");
// 获取指定节点的节点对象
NodeList nameNodeList = document.getElementsByTagName("name");
//要获得所有的要遍历获取,上述获取的是个列表
// 获取指定节点的文本
System.out.println(nameNodeList.item(0).getTextContent());
} catch (Exception e) {
e.printStackTrace();
}
}
}
解析XML可以用SAX或着DOM,但是主流掌握第三方的DOM4J,或着JDOM
SAX是通过事件流,按流的模式,走一点拿一点,不可回退,效率高一点
DOM基于整个文档,要在所有文档加载结束后在操作,一级级找
用DOM4J或着JDOM更加方便!!!!!!!!!!!!
//要先把DOM4J的插件引入
//对于上述图片的解析
public class Dom4JParser {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
// 1、得到要解析文件对象 file对象
File file = new File("src/day01-test.xml");
// 2、得到解析器
SAXReader reader = new SAXReader();
// 3、通过解析器将file文件解析成Document对象
Document document = reader.read(file);
// 4、得到文档对象的根元素对象 Element对象
Element rootElement = document.getRootElement(); // people
//System.out.println(rootElement.getName());
// 5、根元素对象的所有子节点,返回迭代器
Iterator<Element> iterator = rootElement.elementIterator();
// 6、遍历迭代器,得到元素名称和文本
while(iterator.hasNext()) {
Element element = iterator.next();
System.out.println("Name:" + element.getName());
System.out.println("Text:" + element.getText());
System.out.println("StringValue:" + element.getStringValue());
}
}
}