SAX解析XML原理
XML解析原理

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(xml路径);
NodeList list=document.getElementByTagName(XML文档中的标签元素(第一个根节点或是子节点));
Node node=list.item(0);
String content=node.getTextContent();
System.out.println(content);
XML编程(CRUD)-----create read update delete
XML解析技术概述
XML解析方式分为两种:dom和sax
dom:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式
sax:(Simple API for xml)不是官方标准,但他是XML社区事实上的标准,几乎所有的XML解析器都支持他
JAXP
JAXP开发包是J2SE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包组成
在Java.xml.parsers包中,定义了几个工厂类,程序员调用这些工厂,可以得到XML文档的DOM
或SAX的解析器,从而实现对XML文档的解析 Biblioteka 读取XML文档中的值代码:
XML解析开发包:Jaxp(sun) Jdom、dom4j
dom和sax解析方法的区别
SAXReader解析XML文件数据

SAXReader解析XML⽂件数据关于SAXReader解析XML⽂件数据注意:须从maven公共库中添加dom4j依赖包(依赖于元素名和元素的⽅法)解析xml代码private static void parseXml(String path) throws Exception {// 调⽤dom4j依赖包中的SAXReader对象SAXReader saxReader = new SAXReader();// 通过read⽅法可以读取XML数据,返回Document格式对象Document document = saxReader.read(path);// 使⽤getRootElement()⽅法获取根元素,根节点元素是students,返回element对象Element element = document.getRootElement();// 通过element()⽅法,获取该根节点下的所有⼦元素List<Element> list = element.elements("student");//循环遍历所有的⼦元素的信息for (Element studentElement : list) {System.out.println("姓名:"+studentElement.elementText("Name")+",年龄:"+studentElement.elementText("Age")+",性别:"+studentElement.elementText("Gender"));}/*//第⼆种⽅法:通过⼦元素下的标签名---》element()获取对应的元素值for(Element studentElement:list){Element elementName=studentElement.element("Name");Element elementAge=studentElement.element("Age");Element elementGender=studentElement.element("Gender");System.out.println("姓名:"+elementName.getText()+",年龄:"+elementAge.getText()+",性别"+elementGender.getText());}*/}public static void main(String[] args) throws Exception {String path = "src/test/resources/student.xml";parseXml(path);}要解析的student.xml⽂件<?xml version="1.0" encoding="UTF-8"?><students><student number="1801001"><Name>王尼玛</Name><Age>21</Age><Gender>男</Gender></student><student number="1801002"><Name>赵铁柱</Name><Age>22</Age><Gender>男</Gender></student><student number="1801003"><Name>李⼩花</Name><Age>18</Age><Gender>⼥</Gender></student></students>实现结果:解析代码:1、读取xml⽂件创建SAXReader对象并调⽤其read()⽅法来读取xml数据,并返回Document格式的对象。
解析Xml文件的三种方式

解析Xml⽂件的三种⽅式1、Sax解析(simple api for xml) 使⽤流式处理的⽅式,它并不记录所读内容的相关信息。
它是⼀种以事件为驱动的XML API,解析速度快,占⽤内存少。
使⽤回调函数来实现。
1class MyDefaultHander extends DefaultHandler{2private List<Student> list;3private Student student;45 @Override6public void startDocument() throws SAXException {7super.startDocument();8 list=new ArrayList<>();9 }1011 @Override12public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {13super.startElement(uri, localName, qName, attributes);14if(qName.equals("student")){15 student=new Student();1617 }18 preTag=qName;19 }2021 @Override22public void endElement(String uri, String localName, String qName) throws SAXException {23if(qName.equals("student")){24 list.add(student);25 }26 preTag=null;27 }2829 @Override30public void characters(char[] ch, int start, int length) throws SAXException {31if(preTag!=null){32if(preTag.equals("id")){33 student.setId(Integer.parseInt(new String(ch,start,length)));34 }else if(preTag.equals("name")){35 student.setName(new String(ch,start,length));36 }else if(preTag.equals("age")){37 student.setAge(Integer.parseInt(new String(ch,start,length)));38 }39 }40 }41public List<Student> getStudents(){42return list;43 }44 }45public List<Student> sax_parser(){46 List<Student> list=null;47try {48 SAXParser parser= SAXParserFactory.newInstance().newSAXParser();49 InputStream is= getAssets().open("student.xml");50 MyDefaultHander hander=new MyDefaultHander();51 parser.parse(is,hander);52 list= hander.getStudents();53 } catch (ParserConfigurationException e) {54 e.printStackTrace();55 } catch (SAXException e) {56 e.printStackTrace();57 } catch (IOException e) {58 e.printStackTrace();59 }60return list;61 }2、Dom解析 DOM(Document Object Model) 是⼀种⽤于XML⽂档的对象模型,可⽤于直接访问XML⽂档的各个部分。
Android SAX 方式解析XML 字符串

这个是主类:import java.io.StringReader;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.widget.TextView;public class ParsingXML extends Activity {private final String MY_DEBUG_TAG = "WeatherForcaster";public void onCreate(Bundle icicle) {super.onCreate(icicle);TextView tv = new TextView(this);String xml = "<VCOM version='1.1'><loginlink>aHR0cDovLzE5Mi4xNjguMTA0LjExMy9ldW1zL2NsaWV udC90ZW1 wbGF0ZTIwMDA vbW9iaWxlZW50cnkucGhwP3VzZXJuYW1lPWNlc2hp</loginlink><errmsg ></errmsg></VCOM>";// 创建一个新的字符串StringReader read = new StringReader(xml);// 创建新的输入源SAX 解析器将使用InputSource 对象来确定如何读取XML 输入InputSource source = new InputSource(read);try {SAXParserFactory spf = SAXParserFactory.newInstance();SAXParser sp = spf.newSAXParser();XMLReader xr = sp.getXMLReader();ExampleHandler myExampleHandler = new ExampleHandler();xr.setContentHandler(myExampleHandler);xr.parse(source);ParsedExampleDataSet parsedExampleDataSet = myExampleHandler.getParsedData();String url=Base64Coder.decodeString(parsedExampleDataSet.toString());tv.setText(url);} catch (Exception e) {tv.setText("Error: " + e.getMessage());Log.e(MY_DEBUG_TAG, "WeatherQueryError", e);}this.setContentView(tv);}}下面两个类是以SPX 方式解析XML字符串import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class ExampleHandler extends DefaultHandler{private boolean in_mytag = false;private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet();public ParsedExampleDataSet getParsedData() {return this.myParsedExampleDataSet;}public void startDocument() throws SAXException {this.myParsedExampleDataSet = new ParsedExampleDataSet();}public void endDocument() throws SAXException {}public void startElement(String namespaceURI, String localName,String qName, Attributes atts) throws SAXException {if (localName.equals("loginlink")) {this.in_mytag = true;}}public void endElement(String namespaceURI, String localName, String qName) throws SAXException {if (localName.equals("loginlink")) {this.in_mytag = false;}}public void characters(char ch[], int start, int length) {if(this.in_mytag){myParsedExampleDataSet.setExtractedString(new String(ch, start, length));}}}public class ParsedExampleDataSet {private String extractedString = null;public String getExtractedString() {return extractedString;}public void setExtractedString(String extractedString) { this.extractedString = extractedString;}public String toString(){return "ExtractedString = " + this.extractedString ;}}。
java 会计档案xml解析

java 会计档案xml解析在当今数字化时代,会计领域的信息处理变得越来越重要。
随着企业数量的增长和财务数据的复杂性,需要一种高效、可靠的方式来处理会计档案。
XML(可扩展标记语言)作为一种常用的数据交换格式,被广泛应用于会计领域。
Java作为一种强大而灵活的编程语言,提供了许多工具和库来解析和处理XML文件。
在会计档案XML解析中,Java的优势得到了充分的发挥。
下面将介绍一些主要的Java XML解析库和技术,以及它们在会计档案处理中的应用。
1. DOM(文档对象模型)解析DOM解析器将整个XML文档加载到内存中,并构建一个树形结构,以便于对文档进行操作。
在会计档案XML解析中,DOM解析器可以方便地遍历XML文档的节点,提取和修改数据。
然而,由于DOM解析器将整个文档加载到内存中,对于大型XML文件来说,内存消耗较大。
2. SAX(简单API for XML)解析SAX解析器以事件驱动的方式逐行读取XML文档,并触发相应的事件。
在会计档案XML解析中,SAX解析器可以高效地处理大型XML文件,因为它不需要将整个文档加载到内存中。
通过实现SAX 解析器的回调函数,可以在遍历过程中处理和提取数据。
3. JAXB(Java体系结构的XML绑定)解析JAXB是Java提供的一种用于将XML文档与Java对象之间进行转换的技术。
在会计档案XML解析中,可以使用JAXB将XML文档映射到Java对象上,从而方便地进行数据操作和处理。
JAXB提供了注解和配置文件来定义XML文档和Java对象之间的映射关系。
除了上述的XML解析库和技术,还有其他一些Java工具和库,如JDOM、Xerces和StAX等,也可以用于会计档案XML解析。
根据具体的需求和项目要求,可以选择合适的解析方式。
在实际应用中,会计档案XML解析的过程可能涉及到数据验证、数据转换、数据存储等多个环节。
因此,除了XML解析技术外,还需要结合其他相关的Java技术和数据库技术来完成整个处理流程。
xml 格式 解析

xml 格式解析XML格式解析是一种常见的数据解析方法,它可以将XML格式的数据转换为可供程序使用的数据结构。
XML即可扩展标记语言(eXtensible Markup Language),它被广泛应用于数据交换和存储。
下面将介绍XML格式解析的原理和常用的解析方法。
XML格式解析的原理是通过读取XML文件并识别其中的标签、属性和文本内容,将其转换为内存中的数据结构,以便程序进行进一步处理。
XML文件由起始标签、结束标签、属性和文本内容组成。
解析器会根据这些组成部分对XML文档进行解析。
常用的XML格式解析方法有两种:DOM解析和SAX解析。
DOM(文档对象模型)解析是一种将整个XML文档加载到内存中,并构建一个XML树结构的解析方法。
它可以方便地对XML文档进行增删改查操作。
DOM解析器会先将整个XML文档加载到内存中,然后构建一个树状结构,通过遍历树状结构来访问和操作XML文档的节点。
SAX(简单 API for XML)解析是一种基于事件驱动的解析方法。
它边读取XML文档边解析,并在读取到XML文档的不同部分时触发相应的事件。
相比DOM解析,SAX解析更加高效,特别适用于大型XML文件的解析。
SAX解析器会逐行读取XML文档,当遇到起始标签、结束标签或文本内容时触发相应的事件,并通过事件处理程序来处理这些事件。
选择使用DOM解析还是SAX解析取决于具体的需求。
如果需要对XML文档进行多次操作或查询,DOM解析更方便。
但是,如果处理大型XML文件或只需一次性读取XML数据,SAX解析更高效。
总之,XML格式解析是处理XML数据的重要技术。
通过DOM解析和SAX 解析,我们可以将XML格式的数据转换为程序可以处理的数据结构,实现数据的读取、分析和操作。
xml文件解析方法

xml文件解析方法XML文件解析方法引言:XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有良好的可读性和灵活性,被广泛应用于数据交换和配置文件等领域。
在处理XML文件时,解析是必不可少的环节。
本文将介绍几种常用的XML文件解析方法,包括DOM、SAX和StAX。
一、DOM解析方法DOM(文档对象模型)是一种将整个XML文件以树形结构加载到内存中的解析方法。
DOM解析器将XML文件解析为一个树状结构,通过遍历节点来获取和操作XML文件中的数据。
DOM解析方法的优点是易于理解和使用,可以随机访问XML文件中的任意节点,但缺点是占用内存较大,不适用于大型XML文件的解析。
1. 创建DOM解析器对象:使用标准的Java API,可以通过DocumentBuilderFactory类来创建DOM解析器对象。
2. 加载XML文件:通过DOM解析器对象的parse()方法加载XML文件,将其转化为一个树形结构。
3. 遍历节点:使用DOM解析器对象提供的方法,如getElementsByTagName()、getChildNodes()等,可以遍历XML文件中的各个节点,获取节点的名称、属性和文本内容等信息。
4. 获取节点数据:通过节点对象提供的方法,如getNodeName()、getTextContent()等,可以获取节点的名称和文本内容。
二、SAX解析方法SAX(简单API for XML)是一种基于事件驱动的XML解析方法。
在SAX解析过程中,解析器顺序读取XML文件,当遇到节点开始、节点结束或节点文本等事件时,会触发相应的回调方法。
相比于DOM 解析方法,SAX解析方法具有内存占用小、解析速度快的优点,但缺点是无法随机访问XML文件中的节点。
1. 创建SAX解析器对象:使用标准的Java API,可以通过SAXParserFactory类来创建SAX解析器对象。
2. 实现事件处理器:自定义一个事件处理器,实现SAX解析器提供的DefaultHandler类,并重写相应的回调方法,如startElement()、endElement()和characters()等。
SAX解析器解析xml详解

XML的解析器原理及性能比较,SAX详解1 DOMDOM 是用与平台和语言无关的方式表示XML 文档的官方W3C 标准。
DOM 是以层次结构组织的节点或信息片断的集合。
这个层次结构允许开发人员在树中寻找特定信息。
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。
由于它是基于信息层次的,因而DOM 被认为是基于树或基于对象的。
DOM 以及广义的基于树的处理具有几个优点。
首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,而不是像SAX 那样是一次性的处理。
DOM 使用起来也要简单得多。
另一方面,对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。
这些基于事件的模型,比如SAX。
2 SAX这种处理的优点非常类似于流媒体的优点。
分析能够立即开始,而不是等待所有的数据被处理。
而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于大型文档来说是个巨大的优点。
事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
一般来说,SAX 还比它的替代者DOM 快许多。
3 选择DOM 还是选择SAX ?对于需要自己编写代码来处理XML 文档的开发人员来说,选择DOM 还是SAX 解析模型是一个非常重要的设计决策。
DOM 采用建立树形结构的方式访问XML 文档,而SAX 采用的事件模型。
DOM 解析器把XML 文档转化为一个包含其内容的树,并可以对树进行遍历。
用DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。
可以很容易的添加和修改树中的元素。
然而由于使用DOM 解析器的时候需要处理整个XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML 文件的时候。
由于它的遍历能力,DOM 解析器常用于XML 文档需要频繁的改变的服务中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SAX是一个用于处理XML事件驱动的“推”模型,虽然它不是W3C标准,但它却是一个得到了广泛认可的API。
SAX解析器不像DOM那样建立一个完整的文档树,而是在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。
常见的事件处理器有三种基本类型: ● 用于访问XML DTD内容的DTDHandler; ● 用于低级访问解析错误的ErrorHandler; ● 用于访问文档内容的ContentHandler,这也是最普遍使用的事件处理器。
图 2显示了SAX解析器如何通过一个回调机制报告事件。
解析器读取输入文档并在处理文档时将每个事件推给文档处理器(MyContentHandler)。
与DOM相比,SAX解析器能提供更好的性能优势,它提供对XML文档内容的有效低级访问。
SAX模型最大的优点是内存消耗小,因为整个文档无需一次加载到内存中,这使SAX解析器可以解析大于系统内存的文档。
另外,你无需像在DOM中那样为所有节点创建对象。
最后,SAX“推”模型可用于广播环境,能够同时注册多个ContentHandler,并行接收事件,而不是在一个管道中一个接一个地进行处理。
SAX的缺点是你必须实现多个事件处理程序以便能够处理所有到来的事件,同时你还必须在应用程序代码中维护这个事件状态,因为SAX解析器不能交流元信息,如DOM的父/子支持,所以你必须跟踪解析器处在文档层次的哪个位置。
如此一来,你的文档越复杂,你的应用逻辑就越复杂。
虽然没有必要一次将整个文档加载到内存中,但SAX解析器仍然需要解析整个文档,这点和DOM一样。
也许SAX面临的最大问题是它没有内置如XPath所提供的那些导航支持。
再加上它的单遍解析,使它不能支持随机访问。
这一限制也表现在名字空间上: 对有继承名字空间的元素不做注解。
这些限制使SAX很少被用于操作或修改文档。
那些只需要单遍读取内容的应用程序可以从SAX解析中大大受益。
很多B2B和EAI应用程序将XML用做封装格式,接收端用这种格式简单地接收所有数据。
这就是SAX明显优于DOM的地方:因高效而获得高吞吐率。
在SAX 2.0 中有一个内置的过滤机制,可以很轻松地输出一个文档子集或进行简单的文档转换。
SAX SAX,全称Simple API for XML,既是指一种接口,也是指一个软件包。
SAX最初是由David Megginson采用Java语言开发,之后SAX很快在Java开发者中流行起来。
San现在负责管理其原始API 的开发工作,这是一种公开的、开放源代码软件。
不同于其他大多数XML标准的是,SAX没有语言开发商必须遵守的标准SAX参考版本。
因此,SAX的不同实现可能采用区别很大的接口。
作为接口,SAX是事件驱动型XML解析的一个标准接口(standard interface)不会改变,已被OASIS(Organization for the Advancement of Structured Information Standards)所采纳。
作为软件包,SAX最早的开发始于1997年12月,由一些在互联网上分散的程序员合作进行。
后来,参与开发的程序员越来越多,组成了互联网上的XML-DEV社区。
五个月以后,1998年5月,SAX 1.0版由XML-DEV正式发布。
目前,最新的版本是SAX 2.0。
2.0版本在多处与1.0版本不兼容,包括一些类和方法的名字。
SAX的原理 SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
大多数SAX实现都会产生以下类型的事件: 在文档的开始和结束时触发文档处理事件。
在文档内每一XML元素接受解析的前后触发元素事件。
任何元数据通常都由单独的事件交付。
在处理文档的DTD或Schema时产生DTD或Schema事件。
产生错误事件用来通知主机应用程序解析错误。
SAX的常用接口介绍 ContentHandler接口 ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。
该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。
当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。
ContentHandler接口的方法有以下几种: void startDocument() void endDocument() void startElement(String uri, String localName, String qName, Attributes atts) void endElement(String uri, String localName, String qName) void characters(char[ ] ch, int start, int length) DTDHandler接口 DTDHandler用于接收基本的DTD相关事件的通知。
该接口位于org.xml.sax包中。
此接口仅包括DTD事件的注释和未解析的实体声明部分。
SAX解析器可按任何顺序报告这些事件,而不管声明注释和未解析实体时所采用的顺序;但是,必须在文档处理程序的startDocument()事件之后,在第一个startElement()事件之前报告所有的DTD事件。
DTDHandler接口包括以下两个方法 void startDocumevoid notationDecl(String name, String publicId, String systemId) nt() void unparsedEntityDecl(String name, String publicId, String systemId, String notationName) EntityResolver接口 EntityResolver接口是用于解析实体的基本接口,该接口位于org.xml.sax包中。
该接口只有一个方法,如下: public InputSource resolveEntity(String publicId, String systemId) 解析器将在打开任何外部实体前调用此方法。
此类实体包括在DTD内引用的外部DTD子集和外部参数实体和在文档元素内引用的外部通用实体等。
如果SAX应用程序需要实现自定义处理外部实体,则必须实现此接口。
ErrorHandler接口 ErrorHandler接口是SAX错误处理程序的基本接口。
如果SAX应用程序需要实现自定义的错误处理,则它必须实现此接口,然后解析器将通过此接口报告所有的错误和警告。
该接口的方法如下: void error(SAXParseException exception) void fatalError(SAXParseException exception) void warning(SAXParseException exception) 创建SAX解析器 (1)用系统默认值来创建一个XMLReader(解析器): XMLReader reader =XMLReaderFactory.createXMLReader(); (2)从给定的类名称来创建一个XMLReader : XMLReader reader =XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser"); (3)使用javax.xml.parsers包中的SAXParserFactory类和SAXParser类创建: SAXParserFactory spFactory =SAXParserFactory.newInstance(); SAXParser sParser = spFactory.newSAXParser(); DefaultHandler类 DefaultHandler类是SAX2事件处理程序的默认基类。
它实现了EntityResolver、DTDHandler、ContentHandler和ErrorHandler 这四个接口。
包含这四个接口的所有方法,所以我们在编写事件处理程序时,可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法。
如下: import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; public class TestDefaultHandler extends DefaultHandler{ public void startDocument() throws SAXException{ System.out.println("开始解析!"); } public void endDocument() throws SAXException{ System.out.println("解析完成!"); } public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { System.out.println("元素名:"+qName); } public void endElement(String uri, String localName, String qName) throws SAXException{ System.out.println("对"+qName+"的解析完成!"); } } XMLReader接口 XMLReader接口是使用回调读取XML文档的接口。
XMLReader 是XML解析器的SAX2驱动程序必须实现的接口。
此接口允许应用程序设置和查询解析器中的功能和属性,注册文档的事件处理程序,以及对文档的解析。
如下: import org.xml.sax.*; import org.xml.sax.helpers.*; public class TestXMLReader{ public TestXMLReader(){ try{ XMLReader reader =XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser"); System.out.println("创建解析器成功!"); //MyContentHandler是实现了ContentHandler接口的类 reader.setContentHandler(new MyContentHandler()); reader.setDTDHandler(new MyDTDHandler()); //对test.xml进行解析 reader.parse("test.xml"); System.out.println("解析完成!"); }catch(SAXException e){e.printStackTrace();} } }。