JAVA解析XML文件
来源:互联网 发布:第一个python web开发 编辑:程序博客网 时间:2024/05/16 05:19
DOM SAX DOM4J JDOM(DOM,SAX是官方提供的)
如果想在程序中保存xml的结构,建议建立相应的对象将其存储下来( 这也符合面向对象的思想)
我解析的XML文件
DOM: DOM的全称是Document Object Model(文档对象模型),
基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(DOM树),
应用程序正是通过这个对象模型的操作,来实现对xml文档数据的操作,通过DOM接口,
应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称为随机访问机制。
无论XML文档所描述的是什么类型的信息,利用DOM生成的模型都是节点树的形式。
DOM树提供的随机访问方式给应用程序的开发带来了很大的灵活性,但是由于每次解析的时候都是将整个xml文档加载到内存中,
如果xml文件的数据量很大的话,对内存的需求会比较高。对于复杂的数的遍历也是一项耗时的操作,
所以DOM解析方式对机器的要求比较高,实现的效率不怎么理想,
但是由于DOM所采用的树结构的思想与xml文档的结果相吻合,同时鉴于随机访问所带来的方便,
因此DOM的思想还是比较流行。
导包的时候记住是导w3c的包。
import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;/** * Created by Administrator on 2015/1/9. */public class DOMTest { public static void main(String[] args) throws Exception{ //获得dom解析器工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //获取dom的解析器 DocumentBuilder domBuilder = factory.newDocumentBuilder(); //获取一个xml文档的document对象 Document document = domBuilder.parse("src/test.xml"); NodeList list = document.getElementsByTagName("bookstore"); for(int i = 0; i < list.getLength(); ++i) { Element element = (Element)list.item(i); /* //方法一:谨记下面的方式有空白text节点 NodeList childNode = element.getChildNodes(); System.out.println(childNode.getLength()); */ //方法二:推荐使用下面的方式(但是这种方式仅限于知道子节点的标签名) NodeList childNode = element.getElementsByTagName("book"); //遍历书 for(int bk = 0; bk < childNode.getLength(); ++bk) { Element book = (Element)childNode.item(bk); System.out.println("第" + (bk + 1) + "本书的id:" + book.getAttribute("id")); //因为子节点的标签名不定,可以使用上面所述的方法一 NodeList bookChildList = book.getChildNodes(); for(int j = 0; j < bookChildList.getLength(); ++j) if((j&1) == 1) { //只访问奇数节点, 这样就可以避开空白的text节点了 Element element1 = (Element)bookChildList.item(j); System.out.print(element1.getNodeName() + ":"); //获取NodeValue值的时候需要注意 //下面的这种方式访问的都是null, element获取NodeValue会返回null(请仔细查看“常用的节点类型”) //System.out.println(element1.getNodeValue()); //解决的方式有两种 //方法一:获取第一个text节点,然后text节点的值 //System.out.println(element1.getFirstChild().getNodeName()); //方法二:直接调用element节点的getTextContext方法 System.out.println(element1.getTextContent()); } System.out.println(); } } }}
SAX:SAX的全称是Simple APIs for XML (简单应用程序接口)。与DOM不同,SAX提供的访问模式是一种顺序模式,
这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,
应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。
SAX是借助Handler来进行解析xml文档的, 平常使用的时候很少看见直接使用SAX,都是基于SAX的延伸。
import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import java.io.IOException;import java.util.Stack;/** * Created by Administrator on 2015/1/9. */public class SAXTest1 { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse("src/test.xml", new MyHandler()); } static class MyHandler extends DefaultHandler { private Stack<String> stack = new Stack<String>(); @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { stack.push(qName); System.out.print(qName + " ([ "); for(int i = 0; i < attributes.getLength(); ++i) { String attrName = attributes.getQName(i); String attrValue = attributes.getValue(i); System.out.print(attrName + "=" + attrValue); } System.out.println("])"); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { String name = stack.pop(); if(name.equals("book")) { System.out.println(); } } }}
JDOM是用JAVA语言读,写,操作XML的新API函数,结合了DOM和SAX的特性,JDOM中没有text节点。
使用一:用JDOM创建xml文件
import org.jdom.Attribute;import org.jdom.Comment;import org.jdom.Document;import org.jdom.Element;import org.jdom.output.Format;import org.jdom.output.XMLOutputter;import java.io.FileWriter;import java.io.IOException;/** * Created by Administrator on 2015/1/9. */public class JDOMTest { public static void main(String[] args) throws IOException{ Document document = new Document(); Element root = new Element("bookstore"); document.addContent(root); Comment comment = new Comment("hello world"); root.addContent(comment); Element book = new Element("book"); root.addContent(book); Attribute attr = new Attribute("id", "1"); book.setAttribute(attr); Element name = new Element("name"); name.addContent("麦田的守望者"); Element author = new Element("author"); author.addContent("佚名"); Element price = new Element("price"); price.addContent("100"); book.addContent(name); book.addContent(author); book.addContent(price); Format format = Format.getPrettyFormat(); format.setIndent(" "); XMLOutputter out = new XMLOutputter(format); out.output(document, new FileWriter("src/jdom.xml")); }}使用二:使用JDOM解析XML文档
import org.jdom.Attribute;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;import java.io.File;import java.io.IOException;import java.util.List;/** * Created by Administrator on 2015/1/9. */public class JDOMTest2 { public static void main(String[] args) throws IOException, JDOMException { SAXBuilder builder = new SAXBuilder(); Document document = builder.build(new File("src/test.xml")); Element root = document.getRootElement(); System.out.println(root.getName()); //JDOM 中不会产生text节点, 所以这里也不需要节点类型的判断 List<Element> children = root.getChildren(); for(Element book : children) { System.out.print(book.getName() + " (["); List<Attribute> attrs = book.getAttributes(); for(Attribute attr : attrs) { System.out.print(attr.getName() + "=" + attr.getValue() + " "); } System.out.println("])"); List<Element> elements = book.getChildren(); for(Element element : elements) { System.out.println(element.getName() + " " + element.getValue()); } System.out.println(); } }}
DOM4J:全称是Document Object Model For Java, dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,
特别值得一提的是连SunJAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件,一般项目中都要提前导入。
用DOM4J创建XML文件:
import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.UnsupportedEncodingException;/** * Created by Administrator on 2015/1/9. */public class DOM4JTest1 { public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException, IOException { Element root = DocumentHelper.createElement("bookstore"); Document document = DocumentHelper.createDocument(root); Element book = DocumentHelper.createElement("book"); book.addAttribute("id", "1"); root.add(book); Element name = book.addElement("name"); Element author = book.addElement("author"); Element price = book.addElement("price"); name.setText("麦田的守望者"); author.setText("佚名"); price.setText("100"); OutputFormat format = new OutputFormat(" ", true); XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/dom4j.xml"), format); xmlWriter.write(document); xmlWriter.close(); }}
使用DOM4J来解析XML文件:
import org.dom4j.*;import org.dom4j.io.SAXReader;import java.io.File;import java.util.List;/** * Created by Administrator on 2015/1/9. */public class DOM4JTest2 { public static void main(String[] args) throws DocumentException{ SAXReader saxReader = new SAXReader(); Document document = saxReader.read(new File("src/test.xml")); Element root = document.getRootElement(); System.out.println(root.getName()); List<Element> children = root.elements(); for(Element book : children) { System.out.print(book.getName() + " ([ "); List<Attribute> attrs = book.attributes(); for(Attribute attr : attrs) { System.out.print(attr.getName() + "=" + attr.getValue() + " "); } System.out.println(" ])"); List<Element> elements = book.elements(); for(Element element : elements) { System.out.println(element.getName() + " " + element.getText()); } System.out.println(); } }}
- java 解析 xml文件
- java解析xml文件
- Java解析XML文件
- java解析xml文件
- java解析xml文件
- Java解析XML文件
- java解析xml文件
- java解析xml文件
- java解析xml文件
- java解析xml文件
- java解析XML文件
- java解析xml文件
- java解析xml文件
- Java 解析xml文件
- Java解析xml文件
- java解析xml文件
- Java XML文件解析
- java解析xml文件
- Hbase + Mapreduce + eclipse实例
- 11.2.2 测试结构相等
- Linux下VLAN功能的实现
- wp-autopost采集万方数据
- Android源代码调试中logcat的简单使用
- JAVA解析XML文件
- 语音发送UI
- Java 换行 /r/n
- Makefile 中:= ?= += =的区别(转)
- Java中设置session超时的3种方式
- 学习opencv——乱释放内存的Bug,IplImage
- php将UTc时间转换为北京时间
- C++的头文件和实现文件分别写什么
- 一些影响情绪的激素