XML概念和格式
英文(eXtendible Markup Language),是一种可扩展标记语言,没有固定的标签,所有标签都可以自定义,通常用于信息的记录和传递,经常用作配置文件。
格式良好的XML文档
遵循XML文档的基本规则
- 必须要有XML声明语句
- 必须有且仅有一个根元素
- 标签大小写敏感
- 属性值用双引号
- 标签成对
- 元素正确嵌套
<?xml version="1.0" encoding="UTF-8"?>
<books>
<!-- 图书信息 -->
<book id="b01">
<name>java初级教程</name>
<author>陈一</author>
<price>20.5</price>
</book>
<book id="b02">
<name>java中级教程</name>
<author>陈二</author>
<price>30.5</price>
</book>
</books>
有效的XML文档:
- 首先必须是格式良好的
- 使用DTD和XSD(XML Schema)定义语义约束
DTD
英文(Document Type Definition)为“文档类型定义”文档类型定义,DTD肩负着两重任务:一方面它帮助你编写合法的代码,另一方面它让浏览器正确地显示器代码。DTD分为两种:内部DTD和外部DTD。
内部DTD
demo books.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 内部DTD -->
<!DOCTYPE books [ <!-- 定义根元素books -->
<!ELEMENT books (book+)> <!-- 定义books元素有2个元素book +为数量词-->
<!ELEMENT book (name,author,price)> <!-- 定义book元素有3个属性分别为name,author,price -->
<!ATTLIST book id CDATA #REQUIRED> <!-- 属性声明:给book加属性id -->
<!ELEMENT name (#PCDATA)> <!-- name元素为PCDATA类型(被解析文本类型) -->
<!ELEMENT author (#PCDATA)> <!-- 同上 -->
<!ELEMENT price (#PCDATA)> <!-- 同上 -->
]>
<books>
<!-- 图书信息 -->
<book id="b01">
<name>java初级教程</name>
<author>陈一</author>
<price>20.5</price>
</book>
<book id="b02">
<name>java中级教程</name>
<author>陈二</author>
<price>30.5</price>
</book>
</books>
补充
数量词
+ 出现1次或多次,至少1次
? 出现0次或1次
* 出现任意次
常用属性
属性声明
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
属性类型:CDATA 表示字符数据(character data)
默认值:
#REQUIRED 表示必须出现
#IMPLIED 表示不是必须的
其他属性和默认值:放在这里方便查询
外部DTD
和内部DTD声明语法完全相同,注意要去掉内部DTD声明部分
demo: books.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)>
demo:books.xml文件中使用books.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入外部dtd文件 -->
<!DOCTYPE books SYSTEM "books.dtd"> <!-- books为根元素 "books.dtd"为外部dtd文件名-->
<books>
<!-- 图书信息 -->
<book id="b01">
<name>java初级教程</name>
<author>陈一</author>
<price>20.5</price>
</book>
<book id="b02">
<name>java中级教程</name>
<author>陈二</author>
<price>30.5</price>
</book>
</books>
XSD
XML Schema是DTD的替代者
不仅可以规范 XML文档的结构,还可以规范文档的内容
XSD本身也是XML文档
XSD采用XML文档来定义语义约束,比DTD要复杂一些,但是功能强大的多
支持丰富的数据类型
允许开发者自定义数据类型
可读性强
可针对未来需求进行扩展
XML解析
对xml文件进行操作,包括创建xml,对xml进行增删改查操作
常见的xml解析技术
1.DOM解析
sun公司提供的解析方式,是基于XML树的解析(待补充)
2.SAX解析
民间提供的解析方式,是基于事件的解析(待补充)
3.JDOM解析
第三方提供,开源免费,比dom解析方式快(待补充)
4.DOM4J解析
第三方提供,开源免费,JDOM的升级版
demo : 读取XML文件
import java.io.File;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XMLDemo {
public static void main(String[] args) throws DocumentException {
//1.创建SAXReader对象,用来读取xml文件
SAXReader reader = new SAXReader();
//2.读取xml文件,得到Document对象
Document doc = reader.read(new File("src/books.xml"));
//System.out.println(doc);
//3.获取根元素
Element root = doc.getRootElement();
//System.out.println(root.getName());
//4.通过根元素获取子元素的迭代器,遍历子元素
Iterator<Element> it = root.elementIterator();
while(it.hasNext()) {
//取出元素
Element e = it.next();
System.out.println(e.getName());
Attribute id = e.attribute("id"); //获取属性
System.out.println(id.getName()+"="+id.getValue());
//Iterator<Element> it.attributeIterator() 多个属性时也有迭代方法
//获取子元素对象
Element nameElement = e.element("name");
Element authorElement = e.element("author");
Element priceElement = e.element("price");
System.out.println(nameElement.getName()+"="+nameElement.getText());
System.out.println(authorElement.getName()+"="+authorElement.getText());
System.out.println(priceElement.getName()+"="+priceElement.getText());
System.out.println("======================");
}
}
}
demo :生成XML文件(生成books.xml)
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class XMLDemo2 {
public static void main(String[] args) throws IOException {
//1.通过DocumentHelper生成一个Document对象
Document doc = DocumentHelper.createDocument();
//doc.addElement("books").addElement("book").addAttribute("id", "b01");//等价于14-18行
//下面添加元素后返回均为元素,所以可以采用链式编程,但是为了清晰,先按下面这样写
//2.添加并得到根元素
Element root = doc.addElement("books");
//3.为根元素添加子元素
Element book = root.addElement("book");
//4.为book添加属性
book.addAttribute("id", "b01");
//5.为book添加子元素
Element nameElement = book.addElement("name");
Element authorElement = book.addElement("author");
Element priceElement = book.addElement("price");
//6.为子元素添加信息
nameElement.addText("java初级编程");
authorElement.addText("陈一");
priceElement.addText("20.5");
//7.将doc输出到xml文件中
/* Writer fw = new FileWriter(new File("src/books2.xml"));
doc.write(fw);
//8.关闭资源
fw.close();
全输出到一行
*/
//格式良好的输出(XMLWriter类)
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xw = new XMLWriter(new FileWriter(new File("src/books2.xml")),format);
xw.write(doc);
//关闭资源
xw.close();
}
}
demo简便写法
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class XMLDemo3 {
public static void main(String[] args) throws IOException {
Document doc = DocumentHelper.createDocument();
Element root = doc.addElement("books");
//第一本书
Element book1 = root.addElement("book").addAttribute("id", "b01");
book1.addElement("name").addText("java初级教程");
book1.addElement("author").addText("陈一");
book1.addElement("price").addText("20.5");
//第二本书
Element book2 = root.addElement("book").addAttribute("id", "b02");
book2.addElement("name").addText("java中级教程");
book2.addElement("author").addText("陈二");
book2.addElement("price").addText("30.5");
//格式化输出
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xw = new XMLWriter(new FileWriter(new File("src/books3.xml")),format);
xw.write(doc);
//关闭资源
xw.close();
}
}