让我们一起养成写作习惯吧! 这是我参加“掘金每日新计划·四月更新挑战”的第26天。 点击查看活动详情。
前言:程序中访问和操作XML文件一般有两种模型:DOM(文档对象模型)和流模型; 在本文中,它们分别对应于DOM解析和SAX解析。
1. DOM解析和SAX解析相关知识点 1.1 DOM1.2 DOM解析 1.3 SAX解析 1.4 DOM解析和SAX解析对比
基于树,持久存在内存中并且其内容可以修改
基于事件,类似于流式传输,分析可以立即开始,而不是等待所有数据处理完毕
在内存中构建文件树不适合处理大型 XML 文件。
按顺序读取文件并生成相应的事件,并且可以处理任意大小的XML文件。
可以随意访问文件树的任意部分,没有次数限制
只能按顺序分析文件,不支持随机访问文件。
可以随意修改文件树,从而修改XML文件
XML 文件内容只能读取,不能修改。
易于理解,易于开发
开发比较复杂,需要自己制作事件处理程序。
基于DOM建立了文件树
对于员工来说更加灵活,您可以使用 SAX 构建自己的 XML 对象模型
SAX 和 DOM 并不相互排斥。 我们可以使用 DOM 创建 SAX 事件流,也可以使用 SAX 创建 DOM 树。
1.5 XML 和 HTML 的区别
XML(可扩展标记语言)是一种用于定义其他语言的元语言。 它的前身是SGML(标准通用标记语言)。
HTML(-)是超文本标记语言,是WWW的描述语言。
XML旨在描述数据,重点是数据的内容
HTML 旨在显示数据,重点是数据的外观。
xml将数据和显示分开。
Html结合数据和显示,将数据显示在页面上
xml用于描述和存储数据,因此可以作为持久化介质
html用于显示数据
XML 标签是免费的、可定制的且可扩展的
Html 标签是预定义的
xml 中严格区分大小写
html 中不区分大小写
在XML中,它是严格的树形结构,结束标签不能省略。
在 HTML 中,有时松散地,如果上下文清楚地显示段落或列表键的结束位置,则可以省略
或类似的结束标签。
在XML中,属性值必须用引号引起来
在 HTML 中,引号是可选的。
在 XML 中,所有属性都必须有相应的值。
在 HTML 中,可以使用不带值的属性名称。
在 XML 文档中,解析器不会自动删除空格。
HTML 可以过滤掉空格。
xml没有固有的标签
html 使用固有标签,例如
或者等待
2.Java中DOM解析实战(Dom4j解析)
之前写过一篇关于Dom4j解析的博客。 详细内容请参见我的另一篇博客 //...
ps:注意不要导入错误的包。 它是org.dom4j下的一个包。
另外,在XML文件解析中,采用DOM+XPath的方式来加载并解析配置文件。 XPath是XML路径语言(XML Path),它是一种用来确定XML文档某些部分位置的语言。 它是一种设计用于查询 XML 文档的语言。 由于DOM解析XML的方式将整个XML内容加载到内存中并形成树形结构,因此XPath可以配合DOM来解析XML。
以上图片来自百度百科。 对XPath感兴趣的同学可以参考百度百科。 上面的描述已经很清楚了。 链接:/item/XPath/...
3.DOM模式解析XML时属性的作用
规定:
W3C 定义了 XML 解析器如何正确读取 XML 文件编码的三个规则:
如果文本文件的头部有BOM(Byte Order Mark),即字节顺序标记(在编码标准中用于标识文件是采用哪种格式编码的),则遵循BOM。 如果没有 BOM,请检查 XML 声明的编码属性。 如果以上都不存在,则假定 XML 文档是 UTF-8 编码的。
也就是说,XML解析器首先根据文件的BOM来解析文件; 如果未找到 BOM,则使用 XML 中属性指定的编码; 如果XML中没有指定,则默认使用utf-8解析文档。 然后就可以推导了。 如果同时有BOM和BOM,则以BOM指定的为准。
有关详细信息,请参阅我的另一篇博文://...
3.SAX解析
注意不要导入错误的包
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
public class SAXParseDemo {
public static void main(String[] args) {
//1.创建解析工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//2.创建解析器
try {
SAXParser saxParser = saxParserFactory.newSAXParser();
//3.通过解析器的parse方法
saxParser.parse("C:\\Users\\yclw060\\Desktop\\11.xml",new MyDefaultHandler());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class MyDefaultHandler extends DefaultHandler{
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//找到开始标签,输出标签名
System.out.println(qName);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//标签内的文体生成String,然后输出
System.out.println(new String(ch,start,length));
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
//输出结束标签名
System.out.println(qName);
}
}
4.JAXP简介
JAXP(用于 XML 处理的 Java API)是 Java XML 编程的应用程序编程接口之一。 它提供了解析和验证 XML 文档的能力。 JAXP解析XML的三个基本接口是:
文档对象模型解析接口或 DOM 接口 XML 简单 API 解析接口或 SAX 接口 XML 流 API 或 StAX 接口(它是 JDK 6 的一部分,为 JDK 5 提供单独的包) 除了解析接口之外,JAXP 还提供了 XSLT XML 文档执行数据和结构转换的接口。
前面三章已经具体分析了前两种解析方法。 下面简单解释一下剩下的两种方法:
4.1 StAX 接口 StAX 的设计介于DOM 和SAX 接口之间。 在它的比喻中,程序的入口点是代表文档中的位置的光标。 应用程序可以根据需要向前移动光标——从解析器中“拉出”信息。 这与基于事件的 API(例如 SAX)不同,后者将数据“推送”到应用程序,并且如果应用程序需要知道文档中的位置信息,则要求应用程序维护事件之间的状态。 4.2 XSLT接口
介绍:
该界面的主要功能包括: