基于事件模型的MusicXML解析器
- 格式:pdf
- 大小:540.92 KB
- 文档页数:30
一、Java XML解析概述XML(Extensible Markup Language)是一种用于标记电子文件结构的标记语言,它被广泛应用于数据交换和存储。
在Java开发中,对于XML的解析是非常常见的操作,可以通过XML解析将XML文件中的数据提取出来,并进行相应的操作。
二、Java中的XML解析方法Java提供了多种方法用于解析XML文件,包括DOM解析、SAX解析和StAX解析等。
下面将分别介绍这三种解析方法的使用。
1. DOM解析DOM(Document Object Model)解析是一种基于树形结构的XML 解析方式,它将整个XML文档加载到内存中,并以树的形式表示XML文档的结构,允许开发人员在内存中对这棵树进行操作。
使用DOM解析XML的步骤如下:(1)创建一个DocumentBuilderFactory对象。
(2)通过DocumentBuilderFactory对象的newDocumentBuilder()方法创建一个DocumentBuilder对象。
(3)通过DocumentBuilder对象的parse()方法将XML文件解析为一个Document对象。
(4)通过Document对象的getElementsByTagName()等方法获取需要的节点信息。
2. SAX解析SAX(Simple API for XML)解析是一种基于事件驱动的XML解析方式,它逐行读取XML文档,并通过事件通知的方式告诉开发人员解析到了哪些节点。
使用SAX解析XML的步骤如下:(1)创建一个SAXParserFactory对象。
(2)通过SAXParserFactory对象的newSAXParser()方法创建一个SAXParser对象。
(3)自定义一个Handler类,实现org.xml.sax.helpers.DefaultHandler类并重写相应的方法。
(4)通过SAXParser对象的parse()方法解析XML文件,并将Handler对象传入。
解析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解析xml文件的方式android解析xml文件的方式(其一)在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数据通信中,那么在android中如何解析xml文件数据呢?通常有三种方式:DOM,SAX,PULL在这一节中我们使用DOM方式来处理。
DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的,但是这样一来,如果xml文件很大呢?手机CPU处理能力当然不能与PC 机器比,因此在处理效率方面就相对差了,当然这是对于其他方式处理xml文档而言。
解析xml文档,当然必须有xml文档文件啦,下面是一个参考river,放在assets目录.如下:<?xml version="1.0" encoding="utf-8"?><rivers><river name="灵渠" length="605"><introduction>灵渠在广西壮族自治区兴安县境内,是世界上最古老的运河之一,有着“世界古代水利建筑明珠”的美誉。
灵渠古称秦凿渠、零渠、陡河、兴安运河,于公元前214年凿成通航,距今已2217年,仍然发挥着功用。
</introduction><imageurl>/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg</imageurl></river><river name="胶莱运河" length="200"><introduction>胶莱运河南起黄海灵山海口,北抵渤海三山岛,流经现胶南、胶州、平度、高密、昌邑和莱州等,全长200公里,流域面积达5400平方公里,南北贯穿山东半岛,沟通黄渤两海。
java 解析xml方法在Java中,有许多库可以用于解析XML文档。
其中,DOM和SAX 是最常用的两种。
DOM是一种基于树结构的解析方式,而SAX是一种基于事件的解析方式。
1.DOM解析XMLDOM解析器将整个XML文档读入内存,并将其转换为一个树形结构。
这个树形结构可以使用Document Object Model (DOM) API来访问。
DOM解析器可以很容易地遍历这个树形结构,并提取出需要的元素和属性。
下面是一个使用DOM解析器读取XML文件的示例:```javaDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(newFile('example.xml'));Element root = document.getDocumentElement();NodeList nodeList = root.getElementsByTagName('book'); for (int i = 0; i < nodeList.getLength(); i++) {Node node = nodeList.item(i);if (node.getNodeType() == Node.ELEMENT_NODE) {Element element = (Element) node;String title =element.getElementsByTagName('title').item(0).getTextConten t();String author =element.getElementsByTagName('author').item(0).getTextConte nt();System.out.println('Title: ' + title + ', Author: ' + author);}}```在这个例子中,我们使用了DocumentBuilderFactory和DocumentBuilder类来创建一个DOM解析器。
Android解析xml文件的三种方式SAX解析方法介绍:SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备。
SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。
所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。
Pull解析器:Pull解析是一个while循环,随时可以跳出。
Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析工作。
DOM解析:DOM解析XML文件时,会将XML的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。
因为DOM需要将所有内容读取到内存中,所以内存的消耗比较大,不建议使用DOM解析XML文件,若文件较小可行。
首先新建一个xml文件,放在res/raw目录下,没有raw目录则新建一个。
要解析的itcase.xml内容如下:<?xml version="1.0" encoding="UTF-8"?><persons><person id="23"><name>liming</name><age>30</age></person><person id="20"><name>lixiang</name><age>25</age></person></persons>新建一个类存放解析的内容Person.java如下:public class Person {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}以上所需要的准备好了,就开始解析xml工作:首先是SAX解析:新建一个XMLContentHandler.java文件内容如下:public class XMLContentHandler extends DefaultHandler{private List<Person> persons = null;private Person currentPerson;private String tagName = null;//当前解析的元素标签public List<Person> getPersons() {return persons;}@Override/**【文档开始时,调用此方法】**/public void startDocument() throws SAXException {persons = new ArrayList<>();}@Override/**【标签开始时,调用此方法】**//**【uri是命名空间|localName是不带命名空间前缀的标签名|qName是带命名空间前缀的标签名|attributes可以得到所有的属性名和对应的值】**/public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {if (localName.equals("person")) {currentPerson = new Person();currentPerson.setId(Integer.parseInt(attributes.getValue("id")));}this.tagName = localName;}@Override/**【接收标签中字符数据时,调用此方法】**//**【ch存放标签中的内容,start是起始位置,length是内容长度】**/public void characters(char[] ch, int start, int length) throws SAXException {if (tagName != null) {String data = new String(ch, start, length);if (tagName.equals("name")) {this.currentPerson.setName(data);} else if (tagName.equals("age")) {this.currentPerson.setAge(Short.parseShort(data));}}}@Override/**【标签结束时,调用此方法】**//**【localName表示元素本地名称(不带前缀),qName表示元素的限定名(带前缀)】**/public void endElement(String uri, String localName, String qName) throws SAXException {if (localName.equals("person")) {persons.add(currentPerson);currentPerson = null;}this.tagName = null;}}新建一个调用XMLContentHandler中方法的XMLParsingMethods.java类,内容如下:public class XMLParsingMethods {/**【SAX解析XML文件】**/public static List<Person> readXmlBySAX(InputStream inputStream) {try {/**【创建解析器】**/SAXParserFactory spf = SAXParserFactory.newInstance();SAXParser saxParser = spf.newSAXParser();XMLContentHandler handler = new XMLContentHandler();saxParser.parse(inputStream, handler);inputStream.close();return handler.getPersons();} catch (Exception e) {e.printStackTrace();}return null;}}到这里,SAX解析XML文件工作已经完成了,调用XMLPersingMethods中的readXmlBySAX就可以解析itcase.xml文件。
Android中解析XML分类: Android 2011-05-12 19:32 112647人阅读评论(81) 收藏举报androidbooksexceptionstringattributesxmlXML在各种开发中都广泛应用,Android也不例外。
作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。
今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法。
在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。
SAX解析器:SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。
当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。
在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用存少。
非常适合在Android移动设备中使用。
DOM解析器:DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。
分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在存中以树形结构存放,因此检索和更新效率会更高。
但是对于特别大的文档,解析和加载整个文档将会很耗资源。
PULL解析器:PULL解析器的运行方式和SAX类似,都是基于事件的模式。
不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。
PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android 移动设备中使用,Android系统部在解析各种XML时也是用PULL解析器。
Android利用SAX解析XML文件关于Android中解析xml文件qName和localName的问题。
在Android中解析XML文主要有三种方式,分别为Simple API for XML(SAX)、Document Object Model(DOM)和Android附带的PULL解析器。
其中SAX是一个解析速度非常快并且占用内存少的XML解析器,非常适合Android手机等移动设备。
SAX解析XML文件采用事件驱动的方式进行,也就是说,SAX是逐行扫描文件,遇到符合条件的设定条件后就会触发特定的事件,回调你写好的事件处理程序。
使用SAX 的优势在于其解析速度较快,占用内存较少(相对于DOM而言)。
而且SAX在解析文件的过程中得到自己需要的信息后可以随时终止解析,并不一定要等文件全部解析完毕。
凡事有利必有弊,其劣势在于SAX采用的是流式处理方式,当遇到某个标签的时候,它并不会记录下以前所遇到的标签,也就是说,在处理某个标签的时候,比如在startElement方法中,所能够得到的信息就是标签的名字和属性,至于标签内部的嵌套结构,上层标签、下层标签以及其兄弟节点的名称等等与其结构相关的信息都是不得而知的。
实际上就是把XML文件的结构信息丢掉了,如果需要得到这些信息的话,只能你自己在程序里进行处理了。
所以相对DOM而言,SAX 处理XML文档没有DOM方便,SAX处理的过程相对DOM 而言也比较复杂。
使用SAX解析XML文件一般有以下五个步骤:1、创建一个SAXParserFactory对象(通过类名很容易得知它利用工厂方法模式实现的);2、调用SAXParserFactory中的newSAXParser方法创建一个SAXParser对象;3、然后在调用SAXParser中的getXMLReader方法获取一个XMLReader对象;4、在XMLReader中注册事件处理接口,一般有ContentHandler、ErrorHandler、DTDHandler、EntityHandler 四种;5、调用XMLReader中的parse方法解析指定的XML字符串对象;步骤四中提到的四个Handler是事件处理接口,SAX的事件处理函数就定义在这四个接口中,利用SAX解析XML文件需要重写接口中的方法。
XML解析方式XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。
Xml 是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。
扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立。
XML已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。
XML的解析方式基本上分为三类:第一类是基于XML文档树结构的解析,例如DOM(Document Object Model);第二类是基于流式的解析,例如SAX(Simple API for XML)、StAX(Stream API for XML)和XPP(XML Pull Parser);第三类是基于非提取式的解析,例如VTD-XML(Virtual Token Description for XML)。
1DOMDOM是用与平台和语言无关的方式表示诸如XML和HTML文档的W3C(万维网联盟) 官方推荐标准。
它定义了所有文档元素的对象和属性,以及访问它们的API接口。
W3C DOM被分为3个不同的部分,核心DOM、XML DOM和HTML DOM。
核心DOM用于任何结构化文档的标准模型;XML DOM用于XML的标准对象模型和标准编程接口;HTML DOM用于HTML文档的标准模型。
DOM是以层次结构组织的节点或信息片断的集合。
这个层次结构允许开发人员在树中寻找特定信息。
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。
由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
优点:易用性强,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改,它还可以在任何时候在树中上下导航。
MusicXML简明教程MusicXML简明教程1MusicXML简介MusicXML(Music Extensible Markup Language ⾳乐扩展标记语⾔)是⼀个开放的基于XML的⾳乐符号⽂件格式,⽤于进⾏⾳乐交换和⾳乐分发。
MusicXML旨在创建⼀个通⽤的普通西⽅⾳乐记谱格式。
1.1MusicXML形成背景不同⾳乐软件之间的⽂件的交互存在困难。
之前仅有的通⽤交换格式——MIDI,并不能完全满⾜⾳乐软件对做谱的需求。
为了克服MIDI在记谱上的的局限,在MusicXML前相继出现了NIFF(Notation Interchange File Format⾳乐符号交换⽂件格式)、SMDL(Standard Musical Document Language标准⾳乐⽂件语⾔)。
前者⽤图像的形式呈现⾳乐数据,在记谱数据上优于MIDI,但是在⾳乐表现和分析运⽤上劣于MIDI;后者过于复杂,且从未被进⾏商业实现。
因此⼀直以来未曾找到适⽤于⾳乐交换和分发的⾳乐格式。
MuxicXML的诞⽣解决了这些问题。
1.2MusicXML特点MusicXML具有以下⼀些特点:●⽀持17世纪以来的西⽅⾳乐记谱法●基于标准XML技术●⽬前⽀持的软件超过140种●⽀持记谱、分析、信息检索、表现实现●基于两个学院派⾳乐格式:MuseData、Humdrum●对各种⾳乐应⽤软件,不是最优,但是是最充⾜最合适的⾳乐格式1.3MusicXML优势对基于Web的⾳乐记谱,MusicXML有其独特的优势。
XML格式对Web,Web数据库,元数据和信息检索都能提供有效的⽀持,因此MusicXML具有⾼度的互联⽹友好性。
2MusicXML使⽤范例2.1MusicXML结构介绍MusicXML通过元素elements来表现⾳乐语义,当需要呈现的⾳乐内容超过⼀个部分的时候,通过使⽤元素可以创建分层结构。
属性attributes主要⽤于以下⼀些⽅⾯:●指明时候有元素开始和结束,例如连奏slurs元素和多连⾳tuplets元素●识别元素,例如在⼩节编号measure numbers和符杠等级beam levels中●建议元素怎样被显⽰●建议元素怎样以最好的⽅式转化成MIDI或者其他声⾳⽂件。