XML总结
XMl是一种通用的数据交换格式,全称是Extensible Markup Language(可扩展标记语言),用户可以根据XML规则自定义标签。它可以跨越互联网任何的平台,不受编程语言和操作系统的限制,可以说它是一个拥有互联网最高级别通行证的数据携带者。xml是当前处理结构化文档信息中相当给力的技术,xml有助于在服务器之间穿梭结构化数据,这使得开发人员更加得心应手的控制数据的存储和传输。
XML语法
XML和HTML都是标记语言,它们的区别:
- xml严格区分大小写
- xml有且仅有一个根元素,html可以有多个根元素
- xml属性值必须放在""中,html可以不用
- xml空格不会自动删除,html空格自动过滤
- xml标记可以随便定义,且可扩展,html是预定义的
xml的语法格式为:
文档声明:一个完整的xml文件必须包含一个文档声明,且位于文档第一行
<?xml 版本信息 [编码信息] [文档独立性信息]?>例如:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
元素定义:
元素一般由开始标记、属性、元素内容、结束标记组成
例如:<标签></标签>
空元素可以不使用结束标记:</标签>
属性定义:
例如:<售价 单位=“元”>68</售价>
注释:
注释不能出现在xml声明之前,不能出现在标记中,字符串"–“不能出现,不允许以”—>"结尾,不能嵌套使用。
例如:
特殊字符处理:
特殊字符 预定义实体 & & < < > > " " ’ ' CDATA区
Character Data,指不想被程序解析的一段原始数据。以**"<![CDATA[“开始,以”]]>**"结束
DTD约束
xml文档定义了一套规则对内容进行约束,常用约束有两种:DTD约束和Schema约束。
xml引用外部DTD文件格式:
Java中XML的解析
xml解析,即将文件中的内容按照指定的含义进行获取。解析方式有:
- DOM:基于XML树结构,比较耗资源,适用于多次访问XML。
- SAX:基于事件,消耗资源小,适用于数据量较大的XML。SAX是Simple API for XML的缩写,它是事件驱动的,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。
- JDOM:比DOM更快,使用具体类而不使用接口。
- DOM4J:非常优秀的Java XML API,性能优异,功能强大的,开放源代码。
下面介绍DOM4J解析xml的一些操作过程,解析xml文档为下面的scores.xml:
<?xml version="1.0" encoding="utf-8"?>
<students>
<Student>
<Name>张三</Name>
<Num>20200718</Num>
<Classes>0113</Classes>
<Address>上海外国语</Address>
<Tel>123456</Tel>
</Student>
<Student>
<Name>王五</Name>
<Num>20200718</Num>
<Classes>0114</Classes>
<Address>上海外国语</Address>
<Tel>657432</Tel>
</Student>
</students>
用DO4MJ解析,需要导入相应的jar包。首先获取Document对象,这个对象代表xml文档加载到内存的结果。
public class DOM4J {
public static void main(String[] args) {
String path = "src/xml/scores.xml";
//打印内容
print(getDocument(path));
}
/*
* 输入Document对象,打印xml文件
*/
public static void print(Document document) {
if(document == null) {
return;
}
//获取document的根结点
Element root = document.getRootElement();
//获取子结点列表
List<Element> list1 = root.elements();
//遍历子结点列表,并打印内容
for(Element element : list1) {
System.out.print(element.getName()+" [");
//获取下一级结点的列表并循环打印
List<Element> list2 = element.elements();
for(Element e : list2) {
System.out.print(" "+e.getName()+":"+e.getText()+" ");
}
System.out.println("]");
}
}
/*
* 获取指定路径文件的Document对象,并返回
*/
public static Document getDocument(String path) {
//1.指定文件路径 File
File file = new File(path);
Document document = null;
//2.构建SAXReader对象
SAXReader reader = new SAXReader();
try {
//3.读取Document
document = reader.read(file);
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
}
用DOM4J创建一个Document对象,输出到指定路径的xml文件。
public class XMLDom4j {
public static void main(String[] args) throws IOException {
String path = "src/food.xml";
writeXml(path,createDocument());
}
/*
* 创建一个Document对象,添加内容
* <早餐>
* <包子 单价="元">4</包子>
* <油条 单价="元">2</油条>
* </早餐>
*/
public static Document createDocument() {
//创建Document对象
Document document = DocumentHelper.createDocument();
//创建根结点
Element root = document.addElement("早餐");
//创建子结点,链式调用,每个方法返回值都是当前结点
root.addElement("包子").addText("4").addAttribute("单价", "元"); //addAttribute()第一个为属性名,第二个为值
root.addElement("油条").addText("2").addAttribute("单价", "元");
return document;
}
/*
* 指定路径,Document对象,写出一个xml文件
*/
public static void writeXml(String path,Document doc) throws IOException {
//创建输出格式
OutputFormat format = OutputFormat.createPrettyPrint();
//创建输出流
XMLWriter out = new XMLWriter(new FileOutputStream(path),format);
//写入
out.write(doc);
//刷出关闭流
out.flush();
out.close();
}
}
创建结果:
<?xml version="1.0" encoding="UTF-8"?>
<早餐>
<包子 单价="元">4</包子>
<油条 单价="元">2</油条>
</早餐>