Java的四种解析XML方式

来源:互联网 发布:哈尔滨java培训学校 编辑:程序博客网 时间:2024/05/17 05:54

XML:EXtensible Markup Language 可扩展标记语言,主要用于数据的传输与共享,由于其传输与共享数据简单那的这一特性,广泛用于互联网等数据的传输,以及一些框架软件的配置文件.相对于HTML的语法相对松散的特性,XML的语法十分严谨。XML的验证主要通过DTD文件或者Schema文件。(具体baidu或google)

Java解析XML 提供了四种解析方式,每一种方式都有其特点。

首先是想xml.xml文件

<?xml version="1.0" encoding="gbk"?><books><book><bookName>《三国》</bookName><author>罗贯中</author></book><book><bookName>《西游记》</bookName><author>吴承恩</author></book><book><bookName>《水浒》</bookName><author>施耐庵</author></book></books>

第一种:使用DOM的方式解析XML。

DOM是用与平台和语言无关的方式表示XML的官方W3C标准。使用DOM方式能十分方便的解析小型XML文档。其原理是一次性加载整个XML文档到内存,在内存中组织成树形结构,并通过节点与节点的联系来解析XML文档,因而DOM也被认为是基于对象获树的。其特点是简单易学,整个树在内存中是持久的,因而可以它支持以便应用程序能对数据或结构进行修改。但正因为起一次性加载整个文档,其所占用的内存比较大,对内存要求比较高。

public static void main(String[] args) {System.out.println("Hello,world!");String fileName = "D://java/xml/xml.xml";File file = new File(fileName);XMLDemo xmlDemo = new XMLDemo();try {xmlDemo.parseXMLByDOM(file);} catch (Exception e) {// TODO: handle exceptioe.printStackTrace();}}//通过DOM的方式解析XML文件public void parseXMLByDOM(File file)throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.parse(file);NodeList nodeList = doc.getElementsByTagName("book");for (int i = 0; i < nodeList.getLength(); i++) {String book = doc.getElementsByTagName("bookName").item(i).getFirstChild().getNodeValue();String author = doc.getElementsByTagName("author").item(i).getFirstChild().getNodeValue();System.out.println(book+"的作者是:"+author);}}

具体当上面的xml文件的编码方式改成Utf-8时有时可能报com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException错误具体如下:


具体是因为xml文件申明的编码格式与xml文件保存时的编码格式不一致所造成的,因此,有可能encoding=gbk也是会出错的关键在与你电脑保存的编码格式。

第二种SAX解析XML方式

可以说SAX是基于事件的XML解析方式,SAX解析器在解析XML输入的构件时就报告事件,但不会和DOM那样存储文档,有时间来决定是否构件数据结构。在SAX解析时,需要一个处理器来定义不同的解析器事件的时间动作。ContentHandler定义了一下毁掉方法:

StartDocuemnt与endDocument  文档开始或结束时使用一次    startElement与endElement 遇到起始或结束标签时调用  characters遇到字符数据时使用.

SAX 解析DEMO如下:

public static void main(String[] args) {System.out.println("Hello,world!");String fileName = "D://java/xml/xml.xml";File file = new File(fileName);XMLDemo xmlDemo = new XMLDemo();try {// xmlDemo.parseXMLByDOM(file);xmlDemo.parseXMLBySAX(file);} catch (Exception e) {// TODO: handle exceptioe.printStackTrace();}}private void parseXMLBySAX(File file) throws Exception {SAXParserFactory spf = SAXParserFactory.newInstance();SAXParser saxParser = spf.newSAXParser();saxParser.parse(file, new PraseXML());}public class PraseXML extends DefaultHandler {private Vector<String> tagName;private Vector<String> tagValue;private int step;// 开始解析XML文件public void startDocument() throws SAXException {tagName = new Vector<String>();tagValue = new Vector<String>();step = 0;}// 结束解析XML文件public void endDocument() throws SAXException {for (int i = 0; i < tagName.size(); i++) {if (!tagName.get(i).equals("") || tagName.get(i) != null) {System.out.println("节点名称:" + tagName.get(i));System.out.println("节点值:" + tagValue.get(i));}}}public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {// 节点名称tagName.add(qName);// 循环输出属性for (int i = 0; i < attributes.getLength(); i++) {// 获取属性名称System.out.println("属性名称:" + attributes.getQName(i));// 获取属性值System.out.println("属性值:"+ attributes.getValue(attributes.getQName(i)));}}/** * 在遇到结束标签时调用此方法 */public void endElement(String uri, String localName, String qName)throws SAXException {step = step + 1;}/** * 读取标签里的值,ch用来存放某行的xml的字符数据,包括标签,初始大小是2048, 每解释到新的字符会把它添加到char[]里。 * * 注意,这个char字符会自己管理存储的字符, 并不是每一行就会刷新一次char,start,length是由xml的元素数据确定的, * 暂时找不到规律,以后看源代码. *  * 这里一个正标签,反标签都会被执行一次characters,所以在反标签时不用获得其中的值 */public void characters(char ch[], int start, int length)throws SAXException {// 只要当前的标签组的长度一至,值就不赋,则反标签不被计划在内if (tagName.size() - 1 == tagValue.size()) {tagValue.add(new String(ch, start, length));}}public Vector getTagName() {return tagName;}public void setTagName(Vector tagName) {this.tagName = tagName;}public Vector getTagValue() {return tagValue;}public void setTagValue(Vector tagValue) {this.tagValue = tagValue;}}

第三种JDOM

第四种DOM4J