1.源码详解系列(三) --dom4j的码分使用和分析(重点对比和DOM、SAX的码分区别)
2.java的xml的解析方式有什么,他们的码分解析流程是怎么样的,有什么区别
3.xml sax localNameåqNameçåºå«
源码详解系列(三) --dom4j的码分使用和分析(重点对比和DOM、SAX的码分区别)
dom4j是用于读写XML的工具,其API相比JDK的码分jqueryui 设计器 源码JAXP更易用,在国内受到欢迎。码分本文将详细说明如何使用dom4j并分析其源码,码分同时对比DOM和SAX解析方法。码分
DOM和SAX是码分读取XML节点的方法,DOM在内存中构建整个XML树,码分便于查找节点;SAX则是码分江恩主图源码边读取边处理节点,不构建树,码分性能更高但不支持随机访问。码分DOM适合大型XML文件,码分SAX适合大文件或不支持随机访问的场景。
本文首先介绍了使用dom4j的项目环境,包括JDK版本、Maven版本、IDE以及dom4j版本。Maven依赖应为Maven Project类型,打包方式为jar,并注意引入jaxen jar包以支持XPath。梦幻西游架设源码
接着,文章描述了使用dom4j编写XML的需求,并详细说明了如何使用dom4j写XML和读XML,强调了dom4j在节点操作上的优势。使用XPath获取指定节点部分,文章介绍了XPath的基本语法,帮助用户实现直接通过路径找到节点的功能。
源码分析部分,文章解释了dom4j如何将XML元素抽象为具体对象,构建树形数据结构,并分析了读取XML节点的开源视觉定位源码过程,指出dom4j直接调用了JAXP SAX API,继承了JAXP的实现。
最后,文章对比了dom4j与JAXP的优缺点,从易用性、性能和代码解耦性进行分析。在易用性上,dom4j的API更为简洁;性能方面,JAXP DOM在读取时稍快,而dom4j在写入时表现更优;代码解耦性上,使用JAXP更符合项目中代码重用和易维护的小汉科技源码原则。
综上,作者推荐直接使用JAXP而不是dom4j,因为JAXP在项目中使用更为广泛,可以减少代码改动,确保更好的兼容性和扩展性。尽管dom4j在某些方面更为简便,但在考虑项目长远发展和维护时,选择JAXP更为合理。文章末尾感谢读者阅读并鼓励提供反馈。
java的xml的解析方式有什么,他们的解析流程是怎么样的,有什么区别
答:4种。(或者说是两种,因为JDOM和DOM4J是DOM的两个特殊情况)
1.SAX解析
解析方式是事件驱动机制!
SAX解析器,逐行读取XML文件解析,每当解析到一个标签的开始/结束/内容/属性时,触发事件。
可以在这些事件发生时,编写程序进行相应的处理。
优点:
分析能够立即开始,而不是等待所有的数据被处理。
逐行加载,节省内存,有助于解析大于系统内存的文档。
有时不必解析整个文档,它可以在某个条件得到满足时停止解析。
缺点:
1.单向解析,无法定位文档层次,无法同时访问同一个文档的不同部分数据(因为逐行解析,当解析第n行时,第n-1行)已经被释放了,无法再对其进行操作)。
2. 无法得知事件发生时元素的层次, 只能自己维护节点的父/子关系。
3. 只读解析方式, 无法修改XML文档的内容。
2. DOM解析
是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个 文档和内存中建立文档树模型。程序员可以通过操作文档树, 来完成数据的获取 修改 删除等。
优点:
文档在内存中加载, 允许对数据和结构做出更改。访问是双向的,可以在任何时候在树中双向解析数据。
缺点:
文档全部加载在内存中 , 消耗资源大。
3. JDOM解析
目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一 个Java特定模型,JDOM一直得到大力推广和促进。
JDOM文档声明其目的是“使用%(或更少)的精力解决%(或更多)Java/XML问题” (根据学习曲线假定为%)
优点:
使用具体类而不是接口,简化了DOM的API。
大量使用了Java集合类,方便了Java开发人员。
缺点:
没有较好的灵活性。
性能不是那么优异。
4. DOM4J解析
它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath 支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项, DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一 个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML。
目前许多开源项目中大量采用DOM4J , 例如:Hibernate。
xml sax localNameåqNameçåºå«
1. xmlä¸çlocalNameåQName
[html] view plaincopy
<?xml version="1.0" encoding="utf-8"?>
<websites
xmlns:sina=""
xmlns:baidu="">
<sina:website sina:blog="blog.sina.com">æ°æµª</sina:website>
<baidu:website baidu:blog="hi.baidu.com">ç¾åº¦</baidu:website>
</websites>
Namespaceï¼ç©ºé´å称ï¼å½å空é´ï¼
å¼å ¥çåå æ¯ä¸ºäºé¿å æ··æ·ãä¾å¦ä¸é¢çè¿ä¸ªXMLææ¡£ï¼sinaåbaidué½æblogå±æ§ï¼å®ä¹äºä¸¤ä¸ªnamespaceï¼å°±åsaxå®ç½è¯´çï¼ç¨namespaceæ¯ä¸ºäºå®ç°æ´å¤çæ©å±åè½ï¼ä½ä¸ºåºæ¬åºç¨ï¼å¾å¤æ¶åé½ç¨ä¸å°å®ï¼
sinaçnamespaceï¼
baiduçnamespaceï¼
[html] view plaincopy
xmlns:sina=""
xmlns:baidu="">
namespaceçå¼å¯ä»¥ä»»æï¼ä½æ¯æ³¨æä¸è¦éå¤ãä¸è¬é»è®¤çæ ¼å¼é½æ¯ä»¥urlæ¥ä½ä¸ºnamespaceï¼æ¯å¦
xmlns:android="/apk/res/androidã
Prefixï¼åç¼ï¼
sina:blogä¸ sinaå°±æ¯åç¼ã
LocalNameï¼æ¬å°å称ï¼
sina:blog ä¸blogå°±æ¯localNameã
QNameï¼Qualified Name éå®ï¼æå®ï¼å称ï¼
sina:blogå°±æ¯QNameï¼ç¸å½äºåç¼+":"+LocalNameã
uriï¼ä¸æ¯urlåï¼
ä¾å¦sina:blogçuriå°±æ¯åç¼sinaçnamespaceï¼å³""ã
2.sax解ælocalNameä¸qName
sax simple API for XMLï¼ç°å¨æ两个çæ¬ï¼saxåsax2ã
saxä¸æ¯æLocalNameãQNameåuriã对äºå±æ§sina:blog="blog.sina.com"ï¼sax解æçç»ææ¯LocalName=QName="sina:blog"ï¼uri=""ï¼value="blog.sina.com"ã
sax2æ¯æLocalNameãQNameãuriã对äºå±æ§sina:blog="blog.sina.com"ï¼sax2解æçç»ææ¯
LocalName="blog"ï¼QName="sina:blog"ï¼uri=""ï¼value="blog.sina.com"ã
æµè¯ï¼
TestSax.java
[java] view plaincopy
package com.siqi.xml;
import java.io.File;
import java.io.FileReader;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class TestSax {
public static void main(String... args) {
try {
//Sax2解æXMLææ¡£
System.out.println("parse xml file use sax2");
SaxParseHandler sax2Handler = new SaxParseHandler();
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.setContentHandler(sax2Handler);
xmlReader.setErrorHandler(sax2Handler);
FileReader fileReader = new FileReader("./src/sample.xml");
xmlReader.parse(new InputSource(fileReader));
//sax1解æXMLææ¡£
System.out.println("parse xml file use sax");
SaxParseHandler saxHandler = new SaxParseHandler();
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
File file = new File("./src/sample.xml");
parser.parse(file, saxHandler);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
SaxParseHandler.java
[java] view plaincopy
package com.siqi.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* è¦ç¨sax解æï¼éè¦å®ç°ä¸ä¸ªParseHandler
* @author siqi
*
*/
public class SaxParseHandler extends DefaultHandler{
/**
* éåäºDefaultHandlerä¸çstartElementå½æ°ï¼æ¯è§£æå°
* ä¸ä¸ªå ç´ ï¼elementï¼çæ¶åé½ä¼è§¦åè¿ä¸ªå½æ°ï¼å¹¶ä¸å°è¿ä¸ªelement
* çå±æ§attributesåå¼valueå½ä½åæ°ä¼ è¿æ¥ãé¤äºstartElement,
* è¿æstartDocumentï¼endDOucmentï¼endElementï¼è¦æ ¹æ®éè¦
* éåè¿äºå½æ°ã
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//æå°elementçåºæ¬ä¿¡æ¯ï¼qName
System.out.println("Element qName : "+qName);
System.out.println("Element localName: "+localName);
System.out.println("Element uri : "+uri);
//æå°elementçææå±æ§attributes
for(int i=0; i<attributes.getLength(); i++) {
System.out.println("");
System.out.println(" attribute qName : "+attributes.getQName(i));
System.out.println(" attribute localName: "+attributes.getLocalName(i));
System.out.println(" attribute value : "+attributes.getValue(i));
System.out.println(" attribute uri : "+attributes.getURI(i));
}
System.out.println("");
super.startElement(uri, localName, qName, attributes);
}
}
sample.xmlçå 容æä¸é¢é£ä¸ªxml
æ§è¡ç»æï¼
[html] view plaincopy
parse xml file use sax2
Element qName : websites
Element localName: websites
Element uri :
Element qName : sina:website
Element localName: website
Element uri :
attribute qName : sina:blog
attribute localName: blog
attribute value : blog.sina.com
attribute uri :
Element qName : baidu:website
Element localName: website
Element uri :
attribute qName : baidu:blog
attribute localName: blog
attribute value : hi.baidu.com
attribute uri :
parse xml file use sax
Element qName : websites
Element localName:
Element uri :
attribute qName : xmlns:sina
attribute localName: xmlns:sina
attribute value :
attribute uri :
attribute qName : xmlns:baidu
attribute localName: xmlns:baidu
attribute value :
attribute uri :
Element qName : sina:website
Element localName:
Element uri :
attribute qName : sina:blog
attribute localName: sina:blog
attribute value : blog.sina.com
attribute uri :
Element qName : baidu:website
Element localName:
Element uri :
attribute qName : baidu:blog
attribute localName: baidu:blog
attribute value : hi.baidu.com
attribute uri :
对äºsax2ï¼æ£ç¡®ç解æåºäºqNameï¼LocalNameåuriãsaxä¸è½è¯å«åºåç¼åuriï¼qName=localNameã
3.android xml dom4j
å¨androidç¨åºä¸ï¼æå¨ç¨dom4jæ¥æä½XMLææ¡£çæ¶ååç°ä¸ä¸ªé®é¢ï¼ç¨dom4j解æåºæ¥çææ¡£attributeå称é½æ¯ä¸æ ·çã
ä¾xml为ï¼
[html] view plaincopy
<?xml version="1.0"?>
<root xmlns="http://www.w3.org//XMLSchema">
<element name="Jim" age="" score=""></element>
</root>
å¨è§£æçæ¶å解æåºæ¥çå 容为
[html] view plaincopy
<?xml version="1.0"?>
<root xmlns="http://www.w3.org//XMLSchema">
<element name="Jim" name="" name=""></element>
</root>
äºæ¯æå¼å§çdom4jçæºä»£ç ï¼å¨androidä¸dom4jè·åå°çqNameæ¯ç©ºå符ãéè¿æ¥çcallStackåç°androidä¸ç¨çsaxparseråPCä¸saxparserä¸ä¸æ ·ï¼æ£å¨è¿ä¸æ¥ç 究ä¸..