JAVA读取XML文件内容的四种方法
- 格式:pdf
- 大小:140.83 KB
- 文档页数:5
java读取XML⽂件的四种⽅法总结(必看篇)JAVA操作XML⽂档主要有四种⽅式,分别是DOM、SAX、JDOM和DOM4J,DOM和SAX是官⽅提供的,⽽JDOM和DOM4J 则是引⽤第三⽅库的,其中⽤的最多的是DOM4J⽅式。
运⾏效率和内存使⽤⽅⾯最优的是SAX,但是由于SAX是基于事件的⽅式,所以SAX⽆法在编写XML的过程中对已编写内容进⾏修改,但对于不⽤进⾏频繁修改的需求,还是应该选择使⽤SAX。
下⾯基于这四种⽅式来读取XML⽂件。
第⼀,以DOM的⽅式实现。
package xmls;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;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import java.io.File;import java.io.IOException;/*** Created by lenovo on 2017-6-3.*/public class DOMReadDemo {public static void main(String[] args){DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();try{DocumentBuilder db = dbf.newDocumentBuilder();Document document = db.parse("src/xmls/DOM.xml");NodeList booklist = document.getElementsByTagName("book");for(int i = 0; i < booklist.getLength(); i++){System.out.println("--------第" + (i+1) + "本书----------");Element ele = (Element) booklist.item(i);NodeList childNodes= ele.getChildNodes();for(int j = 0; j < childNodes.getLength(); j++){Node n = childNodes.item(j);if(n.getNodeName() != "#text"){System.out.println(n.getNodeName() + ":" + n.getTextContent());}}System.out.println("---------------------------------");}}catch (ParserConfigurationException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}catch (SAXException e){e.printStackTrace();}}}第⼆,以SAX的⽅式实现。
用java读取xml文件的四种方法默认分类2008-09-06 22:37:04 阅读15 评论0 字号:大中小订阅<?xml version="1.0" encoding="GB2312"?><RESULT><VALUE><NO>A1234</NO><ADDR>**省XX县XX镇XX路X段XX号</ADDR></VALUE><VALUE><NO>B1234</NO><ADDR>**省XX市XX乡XX村XX组</ADDR></VALUE></RESULT>第一种DOM 实现方法import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.NodeList;public class MyXMLReader2DOM {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; i < nl.getLength(); i++) {System.out.print("车牌号码:"+doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue( ));System.out.println("车主地址:"+doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValu e());}} catch (Exception e) {e.printStackTrace();}}}第二种,DOM4J实现方法import java.io.*;import java.util.*;import org.dom4j.*;import org.dom4j.io.*;public class MyXMLReader2DOM4J {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();}}}第三种JDOM实现方法import java.io.*;import java.util.*;import org.jdom.*;import org.jdom.input.*;public class MyXMLReader2JDOM {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; i < allChildren.size(); i++) {System.out.print("车牌号码:" + ((Element) allChildren.get(i)).getChild("NO").getText());System.out.println("车主地址:"+ ((Element)allChildren.get(i)).getChild("ADDR").getText());}} catch (Exception e) {e.printStackTrace();}}}第四种SAX实现方法import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class MyXMLReader2SAX extends DefaultHandler {java.util.Stack tags = new java.util.Stack();public MyXMLReader2SAX() {super();}public static void main(String args[]) {long lasting = System.currentTimeMillis();try {SAXParserFactory sf = SAXParserFactory.newInstance();SAXParser sp = sf.newSAXParser();MyXMLReader2SAX reader = new MyXMLReader2SAX();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 SAXException {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);}}已知有一个XML文件(bookstore.xml)如下:<?xml version="1.0" encoding="gb2312"?><bookstore><book genre="fantasy" ISBN="2-3631-4"><title>Oberon's Legacy</title><author>Corets, Eva</author><price>5.95</price></book></bookstore>1、往<bookstore>节点中插入一个<book>节点:XmlDocument xmlDoc=new XmlDocument();xmlDoc.Load("bookstore.xml");XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点xe1.SetAttribute("genre","李赞红");//设置该节点genre属性xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性XmlElement xesub1=xmlDoc.CreateElement("title");xesub1.InnerText="CS从入门到精通";//设置文本节点xe1.AppendChild(xesub1);//添加到<book>节点中XmlElement xesub2=xmlDoc.CreateElement("author");xesub2.InnerText="候捷";xe1.AppendChild(xesub2);XmlElement xesub3=xmlDoc.CreateElement("price");xesub3.InnerText="58.3";xe1.AppendChild(xesub3);root.AppendChild(xe1);//添加到<bookstore>节点中xmlDoc.Save("bookstore.xml");//===============================================结果为:<?xml version="1.0" encoding="gb2312"?><bookstore><book genre="fantasy" ISBN="2-3631-4"><title>Oberon's Legacy</title><author>Corets, Eva</author><price>5.95</price></book><book genre="李赞红" ISBN="2-3631-4"><title>CS从入门到精通</title><author>候捷</author><price>58.3</price></book></bookstore>2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。
Java和XML是黄金组合,网上已经有很多文章介绍,XML作为电子商务中数据交换,已经有其不可替代的作用,但是在平时系统开发中,我们不一定都用到数据交换,是不是无法使用XML了?当然不是,现在已经有一个新趋势,java程序的配置文件都开始使用XML格式,以前是使用类似windows的INI格式。
(Java中也有Propertiesy这样的类专门处理这样的属性配置文件)。
使用XML作为Java的配置文件有很多好处,从Tomcat的安装配置文件和J2ee的配置文件中,我们已经看到XML的普遍应用,让我们也跟随流行趋势用XML武装起来。
现在关键是如何读取XML配置文件?有好几种XML解读器:主要有DOM和SAX ,这些区别网上文章介绍很多。
在apache的XML工程组中,目前有Xerces Xalan Cocoon 几个开发XML相关技术的project.Tomcat本身使用的是 Sun 的JAXP,而其XSL Taglib project中使用Xerces解读器。
好了,上面都是比较烦人的理论问题,还是赶快切入XML的配置文件的读取吧。
在我们的程序中,通常要有一些根据主机环境确定的变量。
比如数据库访问用户名和密码,不同的主机可能设置不一样。
只要更改XML配置文件,就可以正常运行。
localhostsqlnameusernamepassword上面这个myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目录下。
我们编制一个Java程序直接读取,将dbhost dbuserdbpassword提取出来供其他程序访问数据库用。
目前使用SAX比较的多,与DOM主要区别是 SAX是一行一行读取XML文件进行分析,适合比较大文件,DOM是一次性读入内存,显然不能对付大文件。
这里我们使用SAX解读,由于SAX 解读器不断在发展,网上有不少文章是针对老版本的。
如果你使用JDK1.4 ,可以参考使用SAX处理XML文档一文。
JavaXML解析的四种⽅法(连载)1. xml简介 XML:指可扩展标记语⾔, Extensible Markup Language;类似HTML。
XML的设计宗旨是传输数据,⽽⾮显⽰数据。
⼀个xml⽂档实例:1 <?xml version="1.0" encoding="UTF-8"?>2 <company name="Tencent" address="深圳市南⼭区">3 <department deptNo="001" name="development">4 <employee id="devHead" position="minister">许刚</employee>5 <employee position="developer">⼯程师A</employee>6 </department>7 <department deptNo="002" name="education">8 <employee position="minister" telephone="1234567">申林</employee>9 <employee position="trainee">实习⽣A</employee>10 </department>11 </company> 第⼀⾏是 XML 声明。
它定义 XML 的版本 (1.0) 和所使⽤的编码. 下⼀⾏描述⽂档的根元素:<company>开始,该根元素具有2个属性“name”,"address"。
如果在java类中获取xml⽂件⾥⾯的标签⾥⾯的内容。
import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.Map;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;import com.sun.javafx.sg.prism.web.NGWebView;import sun.security.x509.KeyIdentifier;public class getXML {public Document getDocument(){Document doc=null;//xml⽂件的绝对路径。
InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream(".xml");try {doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ParserConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();}return doc;}public void getTags(){Document doc=this.getDocument();//获取xml⽂件⾥<action>元素。
Java获取xml⾥的数据xml是⼀种可扩展的标记语⾔,可以⽤来存储和传输数据。
在java⾥⾯我们可以调⽤相关的⽅法来访问到它。
package com.bikeqx.test;import java.io.IOException;import javax.xml.parsers.*;import org.w3c.dom.*;import org.xml.sax.SAXException;public class Mian {public static void main(String[] args) {// TODO Auto-generated method stubDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = null;try {db = dbf.newDocumentBuilder();} catch (ParserConfigurationException e) {// TODO Auto-generated catch blockSystem.out.println("⽆法获取该对象");}//加载xml⽂件try {Document document = db.parse("test1.xml");NodeList nodelist = document.getElementsByTagName("name");//遍历所有的书for(int i = 0;i < nodelist.getLength();i++){Node book = nodelist.item(i);System.out.println(book.getTextContent());}/*for(Node n:nodelist){}*/}catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}其中test1.xml的内容如下<?xml version="1.0" encoding="utf-8"?><books><book><name>JAVA</name><price> 1.0</price></book><book><name>Android</name><price>2.0</price></book><book><name>Html Css JavaScript</name><price>3.0</price></book></books>⽤上⾯的java代码我们可以轻松的获取到xml的document对象树模型,⽤它来访问到我们想要访问的数据,整体操作和js⾥的dom树基本没什么区别。
java 解析xml方法在Java中,有许多库可以用于解析XML文档。
其中,DOM和SAX 是最常用的两种。
DOM是一种基于树结构的解析方式,而SAX是一种基于事件的解析方式。
1.DOM解析XMLDOM解析器将整个XML文档读入内存,并将其转换为一个树形结构。
这个树形结构可以使用Document Object Model (DOM) API来访问。
DOM解析器可以很容易地遍历这个树形结构,并提取出需要的元素和属性。
下面是一个使用DOM解析器读取XML文件的示例:```javaDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(newFile('example.xml'));Element root = document.getDocumentElement();NodeList nodeList = root.getElementsByTagName('book'); for (int i = 0; i < nodeList.getLength(); i++) {Node node = nodeList.item(i);if (node.getNodeType() == Node.ELEMENT_NODE) {Element element = (Element) node;String title =element.getElementsByTagName('title').item(0).getTextConten t();String author =element.getElementsByTagName('author').item(0).getTextConte nt();System.out.println('Title: ' + title + ', Author: ' + author);}}```在这个例子中,我们使用了DocumentBuilderFactory和DocumentBuilder类来创建一个DOM解析器。
JAVA解析XML的四种方法比较JA V A解析XML的四种方法比较XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。
对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。
基本的解析方式有两种,一种叫SAX,另一种叫DOM。
SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。
假设我们XML的内容和结构如下:view plaincopy to clipboardprint?<?xml version=”1.0″ encoding=”UTF-8″?> <employees><employee><name>ddviplinux</name><sex>m</sex><age>30</age></employee></employees><?xml version=”1.0″ encoding=”UTF-8″?> <employees><employee><name>ddviplinux</name><sex>m</sex><age>30</age></employee></employees>本文使用JA V A语言来实现DOM与SAX的XML文档生成与解析。