细说ava解析mxl文档的常用方法含实例.pdf_第1页
细说ava解析mxl文档的常用方法含实例.pdf_第2页
细说ava解析mxl文档的常用方法含实例.pdf_第3页
细说ava解析mxl文档的常用方法含实例.pdf_第4页
细说ava解析mxl文档的常用方法含实例.pdf_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

细说java解析mxl档的常法(含实例) XML (eXtensible Markup Language) 意为可扩展标记语,被多数技术员以选择作 为数据传输的载体,成为种通的数据交换格式,xml的平台关性,语关性,系统 关性,给数据集成与交互带来了极的便利。在不同的语中,解析mxl的式都是 样的,只不过实现的语法不同已。众所周知,现在解析XML的法越来越多,但 主流的法也就四种,即:DOM、SAX、JDOM和DOM4J。 这四种法的jar包下载地址: DOM:在现在的Java JDK都带了,在xml-apis.jar包 SAX:/projects/sax/ JDOM:/downloads/index.html DOM4J:/projects/dom4j/ 下以个实例来具体说明这4种法: xml件: ?xml version=“1.0“ encoding=“GB2312“? RESULT VALUE NOA1234/NO ADDR四川省XX县XX镇XX路X段XX号/ADDR /VALUE VALUE NOB1234/NO ADDR四川省XX市XX乡XX村XX组/ADDR /VALUE /RESULT 1、使DOM(JAXP Crimson解析器) DOM是与平台和语关的式表XML档的官W3C标准。DOM是以层次结 构组织的节点或信息断的集合。这个层次结构允许开发员在树中寻找特定信息。 分析该结构通常需要加载整个档和构造层次结构,然后才能做任何作。由于它是 基于信息层次的,因DOM被认为是基于树或基于对象的。DOM以及义的基于树 的处理具有个优点。先,由于树在内存中是持久的,因此可以修改它以便应程 序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,不是像SAX那 样是次性的处理。DOM使起来也要简单得多。 实现法: import java.io.*; import java.util.*; import org.w3c.dom.*; import javax.xml.parsers.*; public class MyXMLReader public static void main(String arge) long lasting =System.currentTimeMillis(); try File f=new File(“data_10k.xml“); DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document doc = builder.parse(f); NodeList nl = doc.getElementsByTagName(“VALUE“); for (int i=0;inl.getLength();i+) System.out.print(“牌号码:“ + doc.getElementsByTagName(“NO“ System.out.println(“主地址:“ + doc.getElementsByTagName( catch(Exception e) e.printStackTrace(); 【优点】 允许应程序对数据和结构做出更改。 访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。 【缺点】 通常需要加载整个XML档来构造层次结构,消耗资源。 2. 使SAX SAX处理的优点常类似于流媒体的优点。分析能够即开始,不是等待所有的数 据被处理。且,由于应程序只是在读取数据时检查数据,因此不需要将数据存储 在内存中。这对于型档来说是个巨的优点。事实上,应程序甚不必解析整 个档;它可以在某个条件得到满时停解析。般来说,SAX还它的替代者 DOM快许多。 选择DOM还是选择SAX? 对于需要编写代码来处理XML档的开发员来说, 选择DOM还是SAX解析模型是个常重要的设计决策。 DOM采建树形结构的 式访问XML档,SAX采的事件模型。 DOM解析器把XML档转化为个包含其内容的树,并可以对树进遍历。DOM 解析模型的优点是编程容易,开发员只需要调建树的指令,然后利navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然由于 使DOM解析器的时候需要处理整个XML档,所以对性能和内存的要求较, 尤其是遇到很的XML件的时候。由于它的遍历能,DOM解析器常于XML 档需要频繁的改变的服务中。 SAX解析器采了基于事件的模型,它在解析XML档的时候可以触发系列的事 件,当发现给定的tag的时候,它可以激活个回调法,告诉该法制定的标签已经 找到。SAX对内存的要求通常会较低,因为它让开发员来决定所要处理的 tag.特别是当开发员只需要处理档中所包含的部分数据时,SAX这种扩展能得 到了更好的体现。但SAX解析器的时候编码作会较困难,且很难同时访问同 个档中的多处不同数据。 实现法: import org.xml.sax.*; import org.xml.sax.helpers.*; import javax.xml.parsers.*; public class MyXMLReader extends DefaultHandler java.util.Stack tags = new java.util.Stack(); public MyXMLReader() super(); public static void main(String args) long lasting = System.currentTimeMillis(); try SAXParserFactory sf = SAXParserFactory.newInstance(); SAXParser sp = sf.newSAXParser(); MyXMLReader reader = new MyXMLReader(); sp.parse(new InputSource(“data_10k.xml“), reader); catch (Exception e) e.printStackTrace(); System.out.println(“运时间:“ + (System.currentTimeMillis() - lasting) + public void characters(char ch, int start, int length) throws String tag = (String) tags.peek(); if (tag.equals(“NO“) System.out.print(“牌号码:“ + new String(ch, start, length); if (tag.equals(“ADDR“) System.out.println(“地址:“ + new String(ch, start, length); public void startElement(String uri,String localName,String qName,Attributes attrs) tags.push(qName); 【优点】 不需要等待所有数据都被处理,分析就能即开始。 只在读取数据时检查数据,不需要保存在内存中。 可以在某个条件得到满时停解析,不必解析整个档。 效率和性能较,能解析于系统内存的档。 【缺点】 需要应程序负责TAG的处理逻辑(例如维护/关系等),档越复杂程序 就越复杂。 单向导航,法定位档层次,很难同时访问同档的不同部分数据,不持 XPath。 3、使JDOM JDOM的的是成为Java特定档模型,它简化与XML的交互并且使DOM实现更 快。由于是第个Java特定模型,JDOM直得到推和促进。正在考虑通 过“Java规范请求JSR-102”将它最终作“Java标准扩展”。从2000年初就已经开始了 JDOM开发。 JDOM与DOM主要有两不同。先,JDOM仅使具体类不使接。这在某 些简化了API,但是也限制了灵活性。第,API量使了Collections类,简化 了那些已经熟悉这些类的Java开发者的使。 JDOM档声明其的是“使20%(或更少)的精解决80%(或更多)Java/XML问 题”(根据学习曲线假定为20%)。JDOM对于多数Java/XML应程序来说当然是有 的,并且多数开发者发现APIDOM容易理解得多。JDOM还包括对程序为的 相当泛检查以防户做任何在XML中意义的事。然,它仍需要您充分理解 XML以便做些超出基本的作(或者甚理解某些情况下的错误)。这也许是学 习DOM或JDOM接都更有意义的作。 JDOM不包含解析器。它通常使SAX2解析器来解析和验证输XML档(尽 管它还可以将以前构造的DOM表作为输)。它包含些转换器以将JDOM表输 出成SAX2事件流、DOM模型或XML本档。JDOM是在Apache许可证变体下发布 的开放源码。 实现法: import java.io.*; import java.util.*; import org.jdom.*; import org.jdom.input.*; public class MyXMLReader public static void main(String arge) long lasting = System.currentTimeMillis(); try SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(new File(“data_10k.xml“); Element foo = doc.getRootElement(); List allChildren = foo.getChildren(); for(int i=0;iallChildren.size();i+) System.out.print(“牌号码:“ + (Element)allChildren.get(i).getChild( System.out.println(“主地址:“ + (Element)allChildren.get(i).getChild( catch (Exception e) e.printStackTrace(); 【优点】 使具体类不是接,简化了DOM的API。 量使了Java集合类,便了Java开发员。 【缺点】 没有较好的灵活性。 性能较差。 4、使DOM4J 虽然DOM4J代表了完全独的开发结果,但最初,它是JDOM的种智能分。它合 并了许多超出基本XML档表的功能,包括集成的XPath持、XML Schema持以 及于档或流化档的基于事件的处理。它还提供了构建档表的选项,它通 过DOM4J API和标准DOM接具有并访问功能。从2000下半年开始,它就直处 于开发之中。 为持所有这些功能,DOM4J使接和抽象基本类法。DOM4J量使了API中 的Collections类,但是在许多情况下,它还提供些替代法以允许更好的性能或更 直接的编码法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供 了JDOM得多的灵活性。 在添加灵活性、XPath集成和对档处理的标时,DOM4J的标与JDOM是样 的:针对Java开发者的易性和直观操作。它还致于成为JDOM更完整的解决 案,实现在本质上处理所有Java/XML问题的标。在完成该标时,它JDOM更少 强调防不正确的应程序为。 DOM4J是个常常优秀的Java XML API,具有性能优异、功能强和极端易使 的特点,同时它也是个开放源代码的软件。如今你可以看到越来越多的Java软件 都在使DOM4J来读写XML,特别值得提的是连Sun的JAXM也在DOM4J。 实现法: import java.io.*; import java.util.*; import org.dom4j.*; import org.dom4j.io.*; public class MyXMLReader public static void main(String arge) long lasting = System.currentTimeMillis(); try File f = new File(“data_10k.xml“); SAXReader reader = new SAXReader(); Document doc = reader.read(f); Element root = doc.getRootElement(); Element foo; for (Iterator i = root.elementIterator(“VALUE“); i.hasNext() foo = (Element) i.next(); System.out.print(“牌号码:“ + foo.elementText(“NO“); System.out.println(“主地址:“ + foo.elementText(“ADDR“); catch (Exception e) e.printStackTrace(); ) 【优点】 量使了Java集合类,便Java开发员,同时提供些提性能的替代法。 持XPath。 有很好的性能。 【缺点】 量使了接,API较为复杂。 4种法综合对 1. DOM4J性能最好,连Sun的JAXM也在DOM4J。前许多开源项中量采 DOM4J,例如名的Hibernate也DOM4J来读取XML配置件。如果不考虑可 移植性,那就采DOM4J。 2. JDOM和DOM在性能测试时表现不佳,在测试10M档时内存溢出,但可移植。在 档情况下还值得考虑使DOM和JDOM.虽然JDOM的开发者已经说明他们期望在 正式发版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另 外,DOM仍是个常好的选择。DOM实现泛应于多种编程语。它还是许多 其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于标准的Java模型 相对),所以在某些类型的项中可能也需要它(如在JavaScript中使DOM)。 3. SAX表现较好,这要依赖于它特定的解析式事件驱动。个SAX检测即将到来 的XML流,但并没有载到内存(当然当XML流被读时,会有部分档暂时隐藏 在内存中)。 建议:如果XML档较且不考虑移植性问题建议采DOM4J;如果XML档较 则建议采JDOM;如果需要及时处理不需要保存数据则考虑SAX。但论如何, 还是那句话:适合的才是最好的,如果时间允许,建议家讲这四种法都尝试 遍然后选择种适合的即可。 读取XML配置件 先我们需要通过DocumentBuilderFactory获取xml件的实例。 DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); dbf.setIgnoringElementContentWhitespace(true); 创建档对象 DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(xmlPath); / 使dom解析xml件 最后遍历列表,进数据提取 NodeList sonlist = doc.getElementsByTagName(“son“); for (int i = 0; i sonlist.getLength(); i+) / 循环处理对象 Element son = (Element)sonlist.item(i); for (Node node = son.getFirstChild(); node != null; if (node.getNodeType() = Node.ELEMENT_NODE) String name = node.getNodeName(); String value = node.getFirstChild().getNodeValue(); System.out.println(name+“ : “+value); 完整实例: public static void getFamilyMemebers() DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); dbf.setIgnoringElementContentWhitespace(true); try DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(xmlPath); / 使dom解析xml件 NodeList sonlist = doc.getElementsByTagName(“son“); for (int i = 0; i sonlist.getLength(); i+) / 循环处理对象 Element son = (Element)sonlist.item(i); for (Node node = son.getFirstChild(); node != null; if (node.getNodeType() = Node.ELEMENT_NODE) String name = node.getNodeName(); String value = node.getFirstChild().getNodeValue(); System.out.println(name+“ : “+value); catch (Exception e) e.printStackTrace(); 在XML件中增加节点 差不多同样的步骤,先获取根节点,创建个新的节点,向其中添加元素信息,最 后把这个新节点添加到根节点中 Element root = xmldoc.getDocumentElement(); /删除指定节点 Element son =xmldoc.createElement(“son“); son.setAttribute(“id“, “004“); Element name = xmldoc.createElement(“name“); name.setTextContent(“); son.appendChild(name); Element age = xmldoc.createElement(“name“); age.setTextContent(“0“); son.appendChild(age); root.appendChild(son); 最后不要忘记保存新增的件,对源件进覆盖 TransformerFactory factory = TransformerFactory.newInstance(); Transformer former = factory.newTransformer(); former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath); 完整实例: public static void createSon() DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); dbf.setIgnoringElementContentWhitespace(false); try DocumentBuilder db=dbf.newDocumentBuilder(); Document xmldoc=db.parse(xmlPath); Element root = xmldoc.getDocumentElement(); /删除指定节点 Element son =xmldoc.createElement(“son“); son.setAttribute(“id“, “004“); Element name = xmldoc.createElement(“name“); name.setTextContent(“); son.appendChild(name); Element age = xmldoc.createElement(“name“); age.setTextContent(“0“); son.appendChild(age); root.appendChild(son); /保存 TransformerFactory factory = TransformerFactory.newInstance(); Transformer former = factory.newTransformer(); former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath); catch(Exception e) e.printStackTrace(); 在XML中修改节点信息 通过XPath来获取标节点 public static Node selectSingleNode(String express, Element source) Node result=null; XPathFactory xpathFactory=XPathFactory.newInstance(); XPath xpath=xpathFactory.newXPath(); try result=(Node) xpath.evaluate(express, source, XPathConstants.NODE); catch (XPathExpressionException e) e.printStackTrace(); return result; 获取标节点,进修改,完成后,保存件 Element root = xmldoc.getDocumentElement(); Element per =(Element) selectSingleNode(“/father/sonid=001“, root); per.getElementsByTagName(“age“).item(0).setTextContent(“27“); TransformerFactory factory = TransformerFactory.newInstance(); Transformer former = factory.newTransformer(); former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath); 完整实例: public static void modifySon() DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); dbf.setIgnoringElementContentWhitespace(true); try DocumentBuilder db=dbf.newDocumentBuilder(); Document xmldoc=db.parse(xmlPath); Element root = xmldoc.getDocumentElement(); Element per =(Element) selectSingleNode(“/father/sonid=001“, root); per.getElementsByTagName(“age“).item(0).setTextContent(“27“); TransformerFactory factory = TransformerFactory.newInstance(); Transformer former = factory.newTransformer(); fo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论