浅谈XMl解析的几种方式
1.XMl 简介:“可扩展标记语言”(XML) 提供一种描述结构化数据的方法。与主要用于控制数据的显示和外观的 HTML 标记不同,XML 标记用于定义数据本身的结构和数据类型。 XML 使用一组标记来描绘数据元素。每个元素封装可能十分简单也可能十分复杂的数据。您可以定义一组无限制的 XML 标记。例如,您可以定义一些 XML 标记来声明订单中的数据,如价格、税收、发货地址、帐单地址等等。由于 XML 标记在整个单位中以及跨单位采用,因此来自各种不同数据存储区的数据将更容易交换和操作。 XML 是一种简单、与平台无关并被广泛采用的标准。XML 相对于 HTML 的优点是它将用户界面与结构化数据分隔开来。这种数据与显示的分离使得集成来自不同源的数据成为可能。客户信息、订单、研究结果、帐单付款、病历、目录数据及其他信息都可以转换为 XML。
2.Dom操作xml:2.1用Dom解析XML文档:DOM的全称是DocumentObject Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。 Java代码: package xml; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; /** * java中用Dom解析xml * @author PenghuiJia * 如何将java中的""替换为"" * replaceAll里面用的是正则表达式,所以字符串转义一次, * 正则转义一次,所以一个斜扛要写4个,用replaceAll( "\ ","\\ "); * */ public class DOMDemo { public static void main(String args[]) throws Exception { // step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器) DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); // step 2:获得具体的dom解析器 DocumentBuilderbuilder=factory.newDocumentBuilder(); //获取用户当用户路径 Stringurl=System.getProperty("user.dir")+"srcxmldom_demo_01.xml"; //将路径中替换为 Stringrelurl=url.replaceAll("\","\\"); // step3: 解析一个xml文档,获得Document对象(根结点) Documentdocument=builder.parse(newFile(relurl)); NodeListlist=document.getElementsByTagName("name"); // 输出节点 System.out.println("姓名:"+list.item(0).getFirstChild().getNodeValue()); } } Xml代码: <?xml version="1.0" encoding="GBK"?> <addresslist> <linkman> <name>贾鹏辉</name> <email>penghui-jia@outlook.com</email> </linkman> <linkman> <name>penghuijia</name> <email>penghui-jia@outlook.com</email> </linkman> </addresslist> 2.2用Dom创建XML文档:package xml; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; /** *java中用Dom创建xml * @author PenghuiJia * 如何将java中的""替换为"" *replaceAll里面用的是正则表达式,所以字符串转义一次, * 正则转义一次,所以一个斜扛要写4个,用replaceAll( "\","\\ "); * */ public class DomWriteDemo { public static void main(String args[])throws Exception { // step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器) DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); // step 2:获得具体的dom解析器 DocumentBuilderbuilder=factory.newDocumentBuilder(); //获取用户当用户路径 Stringurl=System.getProperty("user.dir")+"srcxmloutput.xml"; //将路径中替换为 Stringrelurl=url.replaceAll("\","\\"); // step3: 创建一个新xml文档 Documentdocument=builder.newDocument(); ElementaddressList=document.createElement("addressList"); Elementlinkman=document.createElement("linkman"); Elementname=document.createElement("name"); Elementemail=document.createElement("email"); //添加节点内容 name.appendChild(document.createTextNode("penghuijia")); email.appendChild(document.createTextNode("penghuijia@ph.com")); //设置各节点之间的关系 linkman.appendChild(name);//name是linkname的子节点 linkman.appendChild(email);//email是linkname的子节点 addressList.appendChild(linkman); document.appendChild(addressList); //setp4: 创建TransformerFactory实例 TransformerFactorytf=TransformerFactory.newInstance(); Transformert=tf.newTransformer(); t.setOutputProperty(OutputKeys.ENCODING,"GBK");//设置文档编码 DOMSourcedomSource=new DOMSource(document);//准备输出文档 StreamResultstreamResult=new StreamResult(new File(relurl)); t.transform(domSource,streamResult); } } 3. SAX解析xmlSAX的全称是SimpleAPIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。 package sax; importjava.io.File; importjavax.xml.parsers.* ; public class TestSAX { public static void main(String args[])throws Exception { // step1:获得SAX解析器工厂实例 SAXParserFactoryfactory = SAXParserFactory.newInstance() ; //step2: 获得SAX解析器实例 SAXParserparser = factory.newSAXParser() ; //获取用户当用户路径 Stringurl=System.getProperty("user.dir")+"xmldom_demo_01.xml"; //将路径中替换为 Stringrelurl=url.replaceAll("\","\\"); File file=new File(relurl); //step3: 开始进行解析 parser.parse(file,new SaxTest()) ; } } package sax; importorg.xml.sax.Attributes; importorg.xml.sax.SAXException; importorg.xml.sax.helpers.DefaultHandler; public class SaxTest extends DefaultHandler { @Override public void startDocument() throwsSAXException { // TODOAuto-generated method stub System.out.println("<?xmlversion="1.0" encoding="GBK">"); } @Override public void startElement(String uri,String localName,String qName, Attributesattributes) throws SAXException { // TODOAuto-generated method stub System.out.print("<"); System.out.print(qName); //如果存在属性 if (attributes!=null) { //遍历属性 for (int i = 0; i < attributes.getLength(); i++) { //getQName获取属性名,getValue获取属性值 System.out.print(""+attributes.getQName(i)+"=""+attributes.getValue(i)+"""); } } System.out.print(">"); } @Override public void endElement(String uri,String qName) throws SAXException { // TODOAuto-generated method stub System.out.print("<") ; System.out.print(qName) ; System.out.print(">") ; } @Override public void characters(char[] ch,int start,int length) throws SAXException { // TODOAuto-generated method stub //格式化输出 System.out.print(new String(ch,start,length)) ; } @Override public void endDocument() throwsSAXException { // TODOAuto-generated method stub System.out.print("n文档结束!") ; } } 4.Jdom操作xml:JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。(http://jdom.org) ?JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念等),把SAX和DOM的功能有效地结合起来。 ?JDOM是用Java语言读、写、操作XML的新API函数。在直接、简单和高效的前提下,这些API函数被最大限度的优化。 使用Jdom操作xml很简单,必须先导入jdom.jar包(在jdom2.05)中是jdom2.05.jar. 4.1Jdom创建xml文档:package jdom; import java.io.File; import java.io.FileOutputStream; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.output.XMLOutputter; public class WriteXML { public static void main(String args[])throws Exception { Elementaddresslist = new Element("addresslist") ; Elementlinkman = new Element("linkman") ; Elementname = new Element("name") ; Elementemail = new Element("email") ; Attributeid = new Attribute("id","473061") ; Documentdoc = new Document(addresslist) ;// 定义Document对象 name.setText("PenghuiJia") ; name.setAttribute(id); // 将属性设置到元素之中 email.setText("penghui@163.com") ; linkman.addContent(name); // 设置关系 linkman.addContent(email); addresslist.addContent(linkman); XMLOutputterout = new XMLOutputter() ; out.setFormat(out.getFormat().setEncoding("GBK")) ;// 表示的是设置编码 //获取用户当用户路径 Stringurl=System.getProperty("user.dir")+"xmladdress.xml"; //将路径中替换为 Stringrelurl=url.replaceAll("\","\\"); out.output(doc,new FileOutputStream(newFile(relurl))) ; } } 4.2 Jdom解析xml文档:package jdom; import java.io.File; import java.util.List; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.input.SAXBuilder; public class ReadXML { public static void main(String args[])throws Exception { SAXBuilderbuilder = new SAXBuilder() ; //获取用户当用户路径 Stringurl=System.getProperty("user.dir")+"xmladdress.xml"; //将路径中替换为 Stringrelurl=url.replaceAll("\","\\"); Documentread_doc = builder.build(new File(relurl)) ; Elementroot = read_doc.getRootElement() ; // 取得根 Listlist = root.getChildren("linkman") ;// 得到所有的linkman for(int x=0;x<list.size();x++){ Elemente = (Element) list.get(x) ; Stringname = e.getChildText("name") ;// 得到name子节点的内容 Stringid = e.getChild("name").getAttribute("id").getValue(); Stringemail = e.getChildText("email") ; System.out.println("--------------联系人 -------------") ; System.out.println("姓名:" + name +",编号:" + id) ; System.out.println("EMAIL:" + email) ; System.out.println("-----------------------------------") ; System.out.println() ; } } } 5.dom4j操作XML:dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的JavaXML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在哪个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包, Hibernate用它来读写配置文件。 和Jdom一样使用dom4j操作xml文档首先需要导入dom4j-1.6.1.jar开发包。 5.1使用dom4j创建xml文档:import java.io.File; import java.io.FileOutputStream; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; public class DOM4JWriter { public static void main(String args[])throws Exception { Documentdoc = DocumentHelper.createDocument() ; Elementaddresslist = doc.addElement("addresslist") ;// 现在定义一个根节点 Elementlinkman = addresslist.addElement("linkman") ; Elementname = linkman.addElement("name") ; Elementemail = linkman.addElement("email") ; name.setText("xiaojia") ; email.setText("xj@xj.com") ; OutputFormatformat = OutputFormat.createPrettyPrint(); format.setEncoding("GBK") ; //获取用户当用户路径 Stringurl=System.getProperty("user.dir")+"xmladdress.xml"; //将路径中替换为 Stringrelurl=url.replaceAll("\","\\"); XMLWriterwriter = new XMLWriter(newFileOutputStream(new File(relurl)),format) ; writer.write(doc); // 进行输出 writer.close(); } } 5.2使用dom4j解析xml文档:import java.io.File; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class DOM4JReader { public static void main(String args[])throws Exception { //获取用户当用户路径 Stringurl=System.getProperty("user.dir")+"xmladdress.xml"; //将路径中替换为 Stringrelurl=url.replaceAll("\","\\"); Filefile = new File(relurl) ; SAXReaderreader = new SAXReader() ; Documentdoc = reader.read(file);// 读取XML文件 // JDOM操作的时候是要取得根节点 Elementroot = doc.getRootElement() ; // 取得根节点 // 现在应该根据根节点找到全部的子节点,linkman Iteratoriter = root.elementIterator() ; while(iter.hasNext()){ Elementlinkman = (Element) iter.next() ; System.out.println("姓名:" + linkman.elementText("name")) ; System.out.println("邮件:" + linkman.elementText("email")) ; } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |