XML编程(CRUD):
对xml中的元素进行增删改查 create、read、update、delete
我们要进行增删改查的操作就需要先对这个xml文件进行解析,然后才能进行各种其他的操作。
那么xml的文件怎么去解析呢,xml解析分为三种,分别是DOM方式解析、SAX方式解析、PULL方式解析;这里我们只说一下DOM解析和SAX解析,以后有机会我们在说PULL解析。
1,什么是DOM解析?
DOM的全称是Document Object Model 即文档对象模型,是w3c组织推荐的解析xml的一种方式。
2,什么是SAX解析?
SAX的全称是Simple API for XML 不是官方标准,但是它是xml社区事实上的标准,几乎所有的XML解析器都支持它。
3,DOM解析方式的特点
wgp
内容1
内容2
以上这段xml文件内容,dom是这么进行操作的呢?首先dom方式是先把该xml文件的加载到系统内存中,该文件会转化为Document的对象,每一个元素会转化为了Element对象,每一个元素的属性也会转为Attribute对象,每一个元素中的内容会转化为Text对象,我们就是用这些对象进行操作xml文件的,dom解析方式比较容易对xml文件中的内容进行增删改查。
dom的优点:适合增删改查对xml文档。
dom的缺点:加载大问xml文件时会比较占内存。大文件不适合用这种方式。
4,SAX解析方式特点
SAX解析方式和DOM解析方式的区别是:
SAX解析方法只适合用来对xml文件的读取遍历,没有对xml文件进行删除修改等操作。SAX解析是对xml文件进行一行一行的读取,而且读过去的内容他是不能再回头去修改的,所以,如果只我们只是对xml文件的进行读取的话用SAX解析方式是比较高效的,如果我去SAX官网看,会发现官网也是建议我们如果要进行增删改的话还是用dom方式。
sax优点:占用内存小,解析速度快,适合查询。
sax缺点:只适合读取xml文档,不是适合增删改的操作。
小知识点:
如果调整JVM内存的大小?
JVM的大小默认运行程序的空间是64M, 当我们程序的内存占用的超过64M那么就会抛出OutOfMemoryError的错误,我们可以调整虚拟进内存大小,
官网文档 https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
找到这段内容:我看到是java8的文档
-Xmxsize
Specifies the maximum size (in bytes) of the memory allocation pool in bytes. This value must be a multiple of 1024 and greater than 2 MB. Append the letter k
or K
to indicate kilobytes, m
or M
to indicate megabytes, g
or G
to indicate gigabytes. The default value is chosen at runtime based on system configuration. For server deployments, -Xms
and -Xmx
are often set to the same value. See the section "Ergonomics" in Java SE HotSpot Virtual Machine Garbage Collection Tuning Guide at ```http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html`.
The following examples show how to set the maximum allowed size of allocated memory to 80 MB using various units:
-Xmx83886080
-Xmx81920k
-Xmx80m
The -Xmx
option is equivalent to -XX:MaxHeapSize
.
5,解析XML文件的解析工具包
Jaxp(sun) :sun公司提供的开发包
Jdom :开源组织写的
-
dom4j :开源组织写的
他们之间的效率是: dom4j > Jdom >Jaxp
平常用的是最多的是dom4j;
JAXP包的使用:
Jaxp开发包是J2SE的一部分,它是由javax.xml、org.w3c.dom、org.xml.sax包及其子包组成。
在javax.xml.parsers包中,定义了几个工厂类,调用这些工厂类,就可以得到xml问的DOM或SAX的解析器,从而实现对xml文档的解析。
DOM方式的操作xml文档示例代码:
public static void main(String[] args) {
try {
//1,创建工厂
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//2,得到dom解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//3,解析xml文档,得到代表文档的document
Document parse = documentBuilder.parse("src/book.xml");
//4,根据Document对象进行各种操作了 增删改查
//5,再写入xml文档中
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(parse),new StreamResult(new FileOutputStream("src/book.xml")));
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
6,SAX解析
SAX采用事件处理的方式解析XML文件的,利用SAX解析XML文件,涉及到两部分:解析器和事件处理器
解析器可以使用JAXP的API创建,创建出SAX解析器后就可以指定解析器去解析某个XML文档。
解析器采用SAX方式在解析某个XML文档时,它只要解析到文档的一个组成部分,就会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的文件内容作为方法的参数传递给事件处理器。
-
事件处理器由我们自己编写,通过事件处理器中的方法参数,就可以得到SAX解析器解析到的数据并可以对数据进行处理。
从上图我们可以看到SAX解析有四种不同的处理器
1.ContentHandler:内容处理器,当解析到内容的时候调用该处理器。
2.ErrorHandler:错误处理器,当解析发生错误的时候调用的处理器。
3.DTDHandler:DTD约束处理器,当解析到DTD约束内容的时候调用该处理器。
4.EntityResolver:实体处理器,当解析到实体的时候调用该处理器。
我们经常用到的是ContentHandler处理器,该处理器常用的方法是:startElement、endElement、characters
SAX解析代码示例:
public static void main(String[] args) {
try {
//1.创建解析工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//2.得到解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//3.得到读取器
XMLReader xmlReader = saxParser.getXMLReader();
//4.设置内容处理器
xmlReader.setContentHandler(new ListHandler());
//5.读取xml文档内容
xmlReader.parse("src/book.xml");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//自定义内容处理器
class ListHandler extends DefaultHandler {
//打印开始标签
@Override
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
System.out.println("<"+ qName +">");
}
//打印结束标签
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println(""+ qName +">");
}
//打印标签中内容
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println(new String(ch,start,length));
}
}
7,DOM4J 解析xml文档
dom4j是一个简单灵活的开放源代码的库,是由早期开放Jdom的人离开的那一波人独立开发的。与jdom不同的是,dom4j使用接口和抽象基类,虽然dom4j的api相对要复杂一些,但它比Jdom更灵活性。
dom4j是一个非常优秀的Java XML Api,具有性能优越、功能强大和极易使用的特点。现在很多软件采用的都是dom4j,例如Hibernate,sun公司自己的JAXM也用了dom4j。
使用dom4j需要下载相关的jar包。快速入门 看文档爽到不行
dom4j的GitHub地址: https://dom4j.github.io/
XPATH提取xml文档数据
xpath的实例文档 提供中文哦 http://www.zvon.org/xxl/XPathTutorial/
xpath是一种快速定位的xml文档节点的表达式,比如你想直接去拿第100个节点,用xpath这种表达式直接就可以去拿那个节点。
Dom4j的使用xpath的官方文档示例:
public void bar(Document document) {
//获取foo节点下所有bar节点
List list = document.selectNodes("//foo/bar");
//获取foo节点下的bar节点的author节点
Node node = document.selectSingleNode("//foo/bar/author");
//name节点的值
String name = node.valueOf("@name");
}