解析xml的四种方式
XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已。 XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。 针对以下XML文件,会对四种方式进行详细描述: <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id="1"> <name>冰与火之歌</name> <author>乔治马丁</author> <year>2014</year> <price>89</price> </book> <book id="2"> <name>安徒生童话</name> <year>2004</year> <price>77</price> <language>English</language> </book> </bookstore> 一、DOM解析 DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。 优点: 1、形成了树结构,有助于更好的理解、掌握,且代码容易编写。 2、解析过程中,树结构保存在内存中,方便修改。 缺点: 1、由于文件是一次性读取,所以对内存的耗费比较大。 2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。 以下是解析代码: public class DOMTest { static void main(String[] args) { //创建一个DocumentBuilderFactory的对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 创建一个DocumentBuilder的对象 try { 创建DocumentBuilder对象 DocumentBuilder db = dbf.newDocumentBuilder(); 通过DocumentBuilder对象的parser方法加载books.xml文件到当前项目下 Document document = db.parse("books.xml"); 获取所有book节点的集合 NodeList bookList = document.getElementsByTagName("book"); 通过nodelist的getLength()方法可以获取bookList的长度 System.out.println("一共有" + bookList.getLength() + "本书"); 遍历每一个book节点 for (int i = 0; i < bookList.getLength(); i++) { System.out.println("=================下面开始遍历第" + (i + 1) + "本书的内容================="); 通过 item(i)方法 获取一个book节点,nodelist的索引值从0开始 Node book = bookList.item(i); 获取book节点的所有属性集合 NamedNodeMap attrs = book.getAttributes(); System.out.println("第 " + (i + 1) + "本书共有" + attrs.getLength() + "个属性"); 遍历book的属性 int j = 0; j < attrs.getLength(); j++) { 通过item(index)方法获取book节点的某一个属性 Node attr = attrs.item(j); 获取属性名 System.out.print("属性名:" + attr.getNodeName()); 获取属性值 System.out.println("--属性值" + attr.getNodeValue()); } 解析book节点的子节点 NodeList childNodes = book.getChildNodes(); 遍历childNodes获取每个节点的节点名和节点值 System.out.println("第" + (i+1) + "本书共有" + childNodes.getLength() + "个子节点"); int k = 0; k < childNodes.getLength(); k++) { 区分出text类型的node以及element类型的node if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) { 获取了element类型节点的节点名 System.out.print("第" + (k + 1) + "个节点的节点名:" + childNodes.item(k).getNodeName()); 获取了element类型节点的节点值 System.out.println("--节点值是:" + childNodes.item(k).getFirstChild().getNodeValue()); System.out.println("--节点值是:" + childNodes.item(k).getTextContent()); } } System.out.println("======================结束遍历第" + (i + 1) + "本书的内容================="); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } |