java解析xml文件|java如何读取xml文件

java解析xml文件|java如何读取xml文件的第1张示图

A. java解析xml有几种方法

SAX, DOM, jdom , dom4j四种

1、DOM(JAXP Crimson解析器)

DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。

这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。

由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。

首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。

它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。

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解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

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应用程序来说当然是有用的,并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。

然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。

JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。

它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。

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。

比较

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流被读入时,会有部分文档暂时隐藏在内存中)

网页链接

B. java解析XML字符串

你这种写法标签都已经关闭了,当然用getText()获取不到标签内的文本节点的值了.注意,<a/> 这个标签已经关闭了.你要获取它后面的值,只能通过<p>节点来遍历了,解决方法:<a value="a1" /> ,另外如果没解决,最好把源代码发下来看下

C. Java如何读取XML文件 具体实现

xml的解析 1.解析式为了得到里面的内容,进行增,删,改查的操作 XML的解析方式 SAX(Simple API for XML)xml文档的一种简单的解析方式 DOM(Document Object Model) DOM4J SAX:基于事件的解析方式 DOM: 基于对象的解析方式 事件监听三要素 1.事件源 2.监听器 3.事件SAX 基于事件的解析 优点: 简单 效率高 缺点:顺序执行,不能得到某个元素 不能逆向执行 不能进行增,与删的操作SAX解析方式工作原理: 通过时间源xml文档创建SAXParseFactory SAXParserFactory factory=SAXParserFactory.newInstance(); 得到一个解析器 SAXParser parse=factory.newSAXParser(); 对xml文件进行解析 得到解析的文件对象 File file=new File("employees.xml"); 通过监听器进行解析 MyListener listener=new MyListener(); parse.parse(file,listener); 对于监听器有5个方法:监听器所在的类实现的接口有: org.xml.sax.hepers.DefaultHandler org.xml.sax 通过查看API文档中的DefaultHandler类中的下面5个方法 startDocument() 对于文档开始的解析 public void startDocument()throws SAXException{ System.out.println("文档开始解析啦!!!!"); } startElement()元素开始的解析其中几个名词 url:命名空间的url localName:命名空间的前缀 qName:元素 attributes:元素里的属性 public void startElement(String url,String localName,String qName,Attributes attributes)throws SAXException{ StringBuffer sb=new StringBuffer(); sb.append("<"+qName); for(int i=0;i<attributes.getLength();i++){ String attName=attributes.getQName(i);获得元素属性名称其中的i为元素的第几个属性 String attValue=attributes.getValue(i);获得元素属性的值其中的i为元素的第几个属性的值 sb.append(attName+"="+attValue); } sb.append(">"); System.out.print(sb.toString()); } character()获得元素的内容体 public void characters(char[]ch,int start,int length)throws SAXException{ System.out.print(new String(ch,start,length)); } endElement()获得元素的结束事件 public void endElement(String url,String localName,String qName)throws SAXException{ System.out.print("</"+qName+">"); } endDocument()获得文档的结束事件 public void endDocument(){ System.out.println("文档解析结束啦!!!!"); } 对于SAX解析只能逐行解析不能越行解析DOM:基于对象的 优点:灵活,能进行增删的操作 缺点:读取速度慢,效率低 占用的内容多对于DOM解析:不需要添加监听器,按级解析从根元素、一级子元素、二级子元素…… 同SAX解析相同刚开始也是要得到一个解析器; DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance() ; 因为构造方法不可用不可以new对象只能用newInstance()方法得到解析器对象 DocumentBuilder builder=factory.newDocumentBuilder() ;得到一个解析器 对于document可以有两种方法得到: Document document= builder.parse(new File(文件路径));通过parse方法解析一个已有的xml文档 Document document=builder.newDocument();可以得到一个空的document对象 得到根节点 Element root=document.getDocumentElement(); 如果不存在根节点即为一个空document对象的时候只能添加跟节点 Element root=document.createElement(根节点的名字) 得到根节点下面的所有一级子元素 NodeList list=root.getElementsByTagName(根节点的名字可以用root.getTagName或者root.getNodeName()得到根节点的名字)(); { 对与document可以添加一级子元素 不管document是否为空都可以添加 Element firstElements =root.creatElement(一级子元素的名字); 当然也可以为一级子元素添加属性 一级子元素的名字.setAttribute("属性名","属性值"); } 通过遍历list集合 for(int i=0;i<list.getLength();i++){ Element first_elements=(Element)list.item(i); 可以得到一级资源的属性的值当知道属性的时候 String attribute=first_elements.getAttribute("属性的名字"); 得到一级子元素的名字 String first_elements_name=first_elements.getNodeName(); 得到一级子元素下面所有的元素如id 第一个id元素当然也可有很多个id 通过item()来确定要取那个id Element id_element=(Element)first_elements.getElementByName("id").item(0); 得到id的值 String id_value=id_element.getFirstChild().getTextContent(); 通过这个遍历集合可以拿到所有子元素 }DOM添加或删除元素: DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance() ; 因为构造方法不可用不可以new对象只能用newInstance()方法得到解析器对象 DocumentBuilder builder=factory.newDocumentBuilder() ;得到一个解析器 对于document可以有两种方法得到: Document document= builder.parse(new File(文件路径));通过parse方法解析一个已有的xml文档 Document document=builder.newDocument();可以得到一个空的document对象 得到根节点 Element root=document.getDocumentElement(); 如果不存在根节点即为一个空document对象的时候只能添加跟节点 Element root=document.createElement(根节点的名字) 对与document可以添加一级子元素 不管document是否为空都可以添加 Element firstElements =root.creatElement(一级子元素的名字); 当然也可以为一级子元素添加属性 一级子元素的名字.setAttribute("属性名","属性值"); 添加二级子元素 Element secondElements=firstElements.creatElement("二级子元素的名字"); 挂载组装 一级子元素firstElements.append(secondElements); 根节点root.appendChild(firstElements); 将document对象树写入磁盘 TransformerFactory tf=TransformerFactory.newInstance(); Transformer former=tf.newTransformer(); DOMSource source=new DOMSource(document); StreamResult result= new StreamResult(new File("10.xml"));结果集 former.transform(source,result); 完毕DOM4j需要借助外部jar包 需要借助外部jar包就必须设置环境变量中的classpath把classpath设置成 dom4j jar包存在的路径(绝对路径) 例如: set classpath=.;C:\Documents and Settings\Administrator\桌面\day3\dom4j.jarimport org.dom4j.io.*;import java.io.*;import java.util.*;import org.dom4j.*;public static void read_XML(String fileName){ try{ //得到一个解析器,相当于SAX,DOM里面的解析器工厂,与解析器 SAXReader reader=new SAXReader(); //得到一个对象树 Document document=reader.read(new File(fileName)); //得到一个根元素 Element root=document.getRootElement(); System.out.println(root.getName()); //得到所有的一级子元素 List firstElements=root.elements(); Iterator it=firstElements.iterator(); while(it.hasNext()){ //依次得到每一个一级子元素 Element firstElement=(Element)it.next(); System.out.println(firstElement.getName()); //得到所有的属性 List attributes=firstElement.attributes(); for(Object obj:attributes){ //依次得到每一个属性 Attribute att=(Attribute)obj; System.out.println(att.getName()+"="+att.getValue()); } //得到一级子元素下面的所有元素,及其附带值 List second_Elements=firstElement.elements(); Iterator second_Element=second_Elements.iterator(); while(second_Element.hasNext()){ Element sec_Element=(Element)second_Element.next(); System.out.println(sec_Element.getName()+":"+sec_Element.getText()); } System.out.println("———-"); } }catch(Exception e){ }}public static void write(String fileName){ try{ Document document = DocumentHelper.createDocument(); //创造一级子元素 Element books=document.addElement("books"); books.addComment("The book is J2EE"); Element book=books.addElement("book"); 创建元素的属性 book.addAttribute("show","yes"); book.addAttribute("page","100"); 创建二级子元素 Element book_name=book.addElement("bookName"); 创建元素的内容体 book_name.setText("xml"); Element book_price=book.addElement("bookPrice"); book_price.setText("3000"); Element book_press=book.addElement("bookPress"); book_press.setText("etoak"); Element book_author=book.addElement("bookAuthor"); book_author.setText("Robin"); //挂载另一个一级子元素 book=books.addElement("book"); book.addAttribute("show","NO"); book.addAttribute("page","200"); book_name=book.addElement("bookName"); book_name.setText("葵花宝典"); book_price=book.addElement("bookPrice"); book_price.setText("无价之宝"); book_press.addElement("bookPress"); book_press.setText("华山派"); book_author=book.addElement("bookAuthor"); book_author.setText("林平之"); //创建xml文件输出的路径 OutputFormat format=OutputFormat.createPrettyPrint(); format.setEncoding("gbk"); XMLWriter xw=new XMLWriter(new FileOutputStream(fileName), format); //XMLWriter xx= new XMLWriter(System.out,OutputFormat.createPrettyPrint()); xw.write(document); xw.flush(); xw.close(); }catch(Exception e){ 对于DOM4j添加子元素,是一级一级的添加的而在DOM中是先创造 子元素然后再挂载的DOM4j在创建子元素的时候就确定好了顺序 对于文件的输出各有千秋各有特色其中SAX是需要添加监听器的 }}public static void update(String fileName){ try{ SAXReader reader= new SAXReader(); Document document = reader.read(new File(fileName)); Element root = document.getRootElement(); System.out.println(root.getName()); 在根节点上添加一级子元素 Element student=root.addElement("student"); Element id=student.addElement("id"); id.setText("007"); OutputStream os= new FileOutputStream(fileName); OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter xw = new XMLWriter(os,format); xw.write(document); xw.flush(); xw.close(); }catch(Exception e){ 和创建一个新的document对象类似只不过这个的根节点已经存在 直接可以在根节点上添加一级子元素; }}

D. JAVA如何用解析XML文件,如下文件

SAXBuilder sb = new SAXBuilder(); in = new FileInputStream(fileDir); Document doc = null; //通过文件流打开一个xml文件 try { doc = sb.build(in); } catch (IOException ex) { ex.printStackTrace(); } finally { in.close(); } Element root = doc.getRootElement(); List rowList = root.getChildren(); //得到数据来源 for (int i = 0; i < rowList.size(); i++) { Element rows = (Element) rowList.get(i); if (rows.toString().indexOf("字段父") != -1) { List dataList = rows.getChildren(); Iterator iter = dataList.iterator(); for (; iter.hasNext();) { Element infoEle = (Element) iter.next(); //得到数据来源 sjly = String.valueOf(infoEle.getAttributeValue("字段内的值")); //以上为部分代码 ———是啊,你在网上不可能找到一摸一样的,是要你自己根据结构来测试啊,怎么可能找到一摸一样的呢我做的这个就是jdom的,你既然已经实现了,你的就是现成的啊,还要怎么才能算现成的呢

E. JAVA读取XML文件

import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;public class Xml { public static void main(String[] args) { try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("E:\\新建 文本文档 (3).xml")); Element rootElement = document.getDocumentElement(); NodeList list = rootElement.getElementsByTagName("Header"); Element element = (Element) list.item(0); System.out.println(element.getChildNodes().item(0).getNodeValue()); } catch (Exception e) { System.out.println("exception:" + e.getMessage()); } }}

F. java解析xml文件

SaxReader reader = new SaxReader();Document doc = reader.read(new File("class.xml"));Element element = doc.getRootElement();//获取根元素迭代器:取根元素下的子元素名称Iterator<Element> iter = element.elementIterator();while(iter.hashNext){ Element el = (Element)iter.next(); el.getName();//获取元素名称 el.getText();//获取元素值}//获取属性名称、值Iterator<Attribute> iter1 = element.attributeIterator();while(iter1.hashNext()){ Attribute el = (Attribute)iter1.next(); el.getName();el.getValue();//获取属性名称和值}如果取所有,则用递归取:public void getInfo(Element root){ Iterator<Element> iter = root.getElementIterator(); while(iter.hashNext()){ Element element = (Element)iter.next(); getInfo(element);//自己调用自己 递归方法 }}

G. 怎样按要求用Java解析xml

用Java解析xml最常用的是DOM生成和解析XML文档package com.alisoft.facepay.framework.bean; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.; import javax.xml.transform.TransformerException; 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; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * * @author hongliang.dinghl * DOM生成与解析XML文档 */ public class DomDemo implements XmlDocument { private Document document; private String fileName; public void init() { try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); this.document = builder.newDocument(); } catch (ParserConfigurationException e) { System.out.println(e.getMessage()); } } public void createXml(String fileName) { Element root = this.document.createElement("employees"); this.document.appendChild(root); Element employee = this.document.createElement("employee"); Element name = this.document.createElement("name"); name.appendChild(this.document.createTextNode("丁宏亮")); employee.appendChild(name); Element sex = this.document.createElement("sex"); sex.appendChild(this.document.createTextNode("m")); employee.appendChild(sex); Element age = this.document.createElement("age"); age.appendChild(this.document.createTextNode("30")); employee.appendChild(age); root.appendChild(employee); TransformerFactory tf = TransformerFactory.newInstance(); try { Transformer transformer = tf.newTransformer(); DOMSource source = new DOMSource(document); transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); PrintWriter pw = new PrintWriter(new FileOutputStream(fileName)); StreamResult result = new StreamResult(pw); transformer.transform(source, result); System.out.println("生成XML文件成功!"); } catch ( e) { System.out.println(e.getMessage()); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } catch (FileNotFoundException e) { System.out.println(e.getMessage()); } catch (TransformerException e) { System.out.println(e.getMessage()); } } public void parserXml(String fileName) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse(fileName); NodeList employees = document.getChildNodes(); for (int i = 0; i < employees.getLength(); i++) { Node employee = employees.item(i); NodeList employeeInfo = employee.getChildNodes(); for (int j = 0; j < employeeInfo.getLength(); j++) { Node node = employeeInfo.item(j); NodeList employeeMeta = node.getChildNodes(); for (int k = 0; k < employeeMeta.getLength(); k++) { System.out.println(employeeMeta.item(k).getNodeName() + ":" + employeeMeta.item(k).getTextContent()); } } } System.out.println("解析完毕"); } catch (FileNotFoundException e) { System.out.println(e.getMessage()); } catch (ParserConfigurationException e) { System.out.println(e.getMessage()); } catch (SAXException e) { System.out.println(e.getMessage()); } catch (IOException e) { System.out.println(e.getMessage()); } } }

H. java如何读取xml文件

// 读取输入流 SAXReader reader = new SAXReader(); Document document = reader.read(inputStream); // 得到根元素 Element root = document.getRootElement(); // 得到根元素的所有子节点 List<Element> elementList = root.elements(); // 遍历所有子节点 for (Element e : elementList) map.put(e.getName(), e.getText()); // 释放资源 inputStream.close(); inputStream = null; 参考http://blog.csdn.net/lyq8479/article/details/8949088

I. Java里面怎么解析xml文件的内容

import java.io.File;import java.util.Iterator;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class Dom4JReader {public Dom4JReader() {}/**** @Function 获取xml文件里符合要求的数据*/public void getDom() {SAXReader sr = new SAXReader();try {//获取applicationContext.xml文件的对象Document doc = sr.read(new File("applicationContext.xml"));//获得跟节点Element root = doc.getRootElement();//// 枚举所有子节点for (Iterator i = root.elementIterator("bean"); i.hasNext();) {//获取bean节点Element bean = (Element) i.next();// 枚举名称为bean的节点for (Iterator j = bean.attributeIterator(); j.hasNext();) {//获取bean节点的所有属性Attribute attr = (Attribute) j.next();//判断属性的值如果为fileUploadBoif (attr.getText().equals("fileUploadBo")) {//打印出这个bean节点的所有信息System.out.println(bean.asXML());}}}} catch (DocumentException e) {e.printStackTrace();}}}这段代码要执行的话,要导入dom4j的包,还有//获取applicationContext.xml文件的对象

未经允许不得转载:山九号 » java解析xml文件|java如何读取xml文件

赞 (0)