XML
XML简介
XML指可扩展标记语言(EXtensible Markup Language),是一种标记语言。
XML是一种灵活的语言,标签没有被预定义,需要自行定义标签。
通常,XML被用于信息的记录和传递,而非显示数据。XML被设计为具有自我描述性。
XML经常被用于充当配置文件。
XML语法
声明信息,它定义XML的版本(1.0)和所使用的编码(一般为UTF-8)
<?xml version="1.0" encoding="UTF-8"?>
xml有且仅有一个根元素
xml是大小写敏感的
标签是成对的,必须正确嵌套
xml的属性值必须加引号
注释的写法
<!-- 这里是注释 -->
XML 文档形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”。
形式良好的xml实例
<?xml version="1.0" encoding="UTF-8"?> <!-- 这里是注释 --> <books> <book id="01"> <name>java从入门到精通</name> <author>Tom</author> <price>45.6</price> </book> <book id="02"> <name>mysql学习指南</name> <author>lili</author> <price>49.6</price> </book> </books>
拥有正确语法的 XML 被称为“形式良好”的 XML。
通过 DTD 验证的 XML 是“合法”的 XML。
DTD
DTD简介
DTD(Document Type Definition文档类型定义)
DTD用与约束xml的文档格式。可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD可被成行地声明于XML文档中(内部DTD),也可作为一个外部引用(外部DTD)。
使用DTD
内部DTD的定义
<!DOCTYPE 根元素 [元素声明]>
元素声明语法
<!ELEMENT 元素名 (子元素[, 子元素 ...])>
数量词
- + :表示出现 1 次或多次,至少一次。
- ?:表示出现 0 次或 1 次
- * :表示出现任意次
属性声明语法
- 属性类型:CDATA,表示字符数据(character data)
- 默认值:
- #REQUIRED 表示必须出现
- #IMPLIED 表示不是必须的
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
合法的xml实例
<?xml version="1.0" encoding="UTF-8"?> <!-- 声明内部DTD --> <!DOCTYPE books [ <!ELEMENT books (book*) > <!ELEMENT book (name,author,price)> <!ATTLIST book id CDATA #REQUIRED> <!ELEMENT name (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)> ]> <books> <book id="01"> <name>java从入门到精通</name> <author>Tom</author> <price>45.6</price> </book> <book id="02"> <name>mysql学习指南</name> <author>lili</author> <price>49.6</price> </book> </books>
外部DTD定义
创建一个独立的DTD文件
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT books (book*) > <!ELEMENT book (name,author,price)> <!ATTLIST book id CDATA #REQUIRED> <!ELEMENT name (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)>
在xml中引入外部DTD文件
<!DOCTYPE 根元素 SYSTEM "文件名">
实例
<?xml version="1.0" encoding="UTF-8"?> <!-- 引入外部DTD文件 --> <!DOCTYPE book SYSTEM "book.dtd"> <books> <book id="01"> <name>java从入门到精通</name> <author>Tom</author> <price>45.6</price> </book> <book id="02"> <name>mysql学习指南</name> <author>lili</author> <price>49.6</price> </book> </books>
XSD(XML Schema Definition)
XML Schema 是DTD 的替代者
XSD 不仅可以定义XML文档的结构,还可以规范文档的内容
XSD 本身也是XML文档
XSD 采用XML文档来定义语义约束,比DTD要复杂一些,但是功能强大。
- 支持丰富的数据结构
- 允许开发者自定义数据类型
- 可读性强
- 可针对未来需求进行扩展
XML的解析
对xml文件进行操作,包括创建 xml,对 xml 文件进行增删改查操作
常见的xml解析技术
DOM解析
XML DOM(XML Document Object Model),即XML文档对象模型。
是官方提供的解析方式,基于xml树解析。
XML文档对象模型定义访问和操作XML文档的标准方法。
SAX解析
是民间的解析方式,基于事件的解析。
消耗资源小,适用于数据量较大的XML。
JDOM解析
第三方提供,开源免费。
比DOM更快,使用具体类而不使用接口。
DOM4J
第三方提供,开源免费。
是JDOM的升级版。
DOM4J解析XML
借助DOM4J解析读取XML文件内容。
/** * 借助DOM4J解析读取XML文件内容 * * @author shangyang * @throws Exception */ public static void readerXML() throws Exception { // 创建SAXReader对象,用于读取xml SAXReader reader = new SAXReader(); // 读取xml文件,得到Document对象 Document doc = reader.read(new File("src/book.xml")); // 获取根元素 Element root = doc.getRootElement(); // 获取根元素下所有子元素 Iterator<Element> it = root.elementIterator(); while (it.hasNext()) { // 取出元素 Element e = it.next(); // 获取id属性 Attribute id = e.attribute("id"); System.out.println(e.getName() + id.getValue()); // 获取子元素 Element name = e.element("name"); Element author = e.element("author"); Element price = e.element("price"); System.out.println(name.getName() + " = " + name.getStringValue()); System.out.println(author.getName() + " = " + author.getStringValue()); System.out.println(price.getName() + " = " + price.getText()); System.out.println("--------------"); } }
通过DOM4J解析生成xml文件
/** * 通过DOM4J解析生成xml文件 * @author shangyang * @throws Exception */ public static void writerXML() throws Exception { // 1、通过DocumentHelper生成一个Document对象 Document doc = DocumentHelper.createDocument(); // 2、添加并得到根元素 Element root = doc.addElement("sources"); // 3、为根元素添加子元素 Element student = root.addElement("student"); // 4、为student元素添加属性 student.addAttribute("id", "1614010101"); // 5、为student添加子元素 Element name = student.addElement("name"); Element course = student.addElement("course"); Element results = student.addElement("results"); // 6、为子元素添加文本 name.addText("张三"); course.addText("数据结构"); results.addText("67"); // 7、将doc输出到xml文件中 OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(new FileWriter(new File("src/sources.xml")), format); writer.write(doc); writer.close(); }