java xml解析方式(DOM、SAX、JDOM、DOM4J)
程序员文章站
2022-11-14 08:31:20
XML值可扩展标记语言,是用来传输和存储数据的。 XMl的特定: XML元素: XMl元素是只从包括开始标签到结束标签的部分,元素可包含其他元素、文本或两者都包含,也可拥有属性。 XML解析 基础方法:DOM、SAX DOM解析:平台无关的官方解析方式 SAX解析:Java中基于事件驱动的解析方式 ......
xml值可扩展标记语言,是用来传输和存储数据的。
xml的特定:
- xml文档必须包含根元素。该元素是所有其他元素的父元素。xml文档中的元素形成了一颗文档树,树中的每个元素都可存在子元素。
- 所有xml元素都必须有关闭标签。
- xml标签对大小写敏感,并且所有属性值date都需加引号。
xml元素:
xml元素是只从包括开始标签到结束标签的部分,元素可包含其他元素、文本或两者都包含,也可拥有属性。
xml解析
基础方法:dom、sax
dom解析:平台无关的官方解析方式
sax解析:java中基于事件驱动的解析方式
扩展方法:jdom、dom4j (在基础方法上扩展的,只有java能够使用的解析方式)
1.dom解析
优点:
·形成了树结构,直观好理解
·解析过程中树结构保留在内存中方便修改
缺点:
·当xml文件较大时,对内存消耗比较大,容易影响解析性能,并造成内存溢出
import org.w3c.dom.*; import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfactory; import java.util.linkedlist; import java.util.list; /** * dom 解析xml */ public class dom { public static void main(string[] args) throws exception { // 1.创建 documentbuilderfactory 对象 documentbuilderfactory dbf = documentbuilderfactory.newinstance(); // 2.通过 documentbuilderfactory对象创建 documentbuilder对象 documentbuilder db = dbf.newdocumentbuilder(); // 3.使用 documentbuilder对象来加载xml document document = db.parse("bean.xml"); system.out.println("----------------- dom开始解析 xml -----------------"); // 获取 xml 文件的根节点 element element = document.getdocumentelement(); getnoemsg(element); system.out.println("\n\n----------------- dom结束解析 xml -----------------"); } /** * 获取node节点信息 * @param node */ public static void getnoemsg(node node){ if(node.getnodetype() == node.element_node){ system.out.print("<" + node.getnodename()); getnodeattrs(node); system.out.print(">\n"); nodelist nodelist = node.getchildnodes(); // 筛选出节点类型为element_node 的节点 list<node> list = getnodelist(nodelist); node childnode; int len = list.size(); if(len == 0){ system.out.print(node.gettextcontent() + "\n"); }else { for (int i = 0; i < len; i++){ if(list.get(i).getnodetype() == node.element_node){ childnode = list.get(i); getnoemsg(childnode); } } } system.out.println("</" + node.getnodename() + ">"); } } /** * 获取node节点的属性信息 * @param node */ public static void getnodeattrs(node node){ namednodemap attrs = node.getattributes(); node attr; if(attrs.getlength() != 0){ for (int i = 0, len = attrs.getlength(); i < len; i++){ attr = attrs.item(i); system.out.print(" " + attr.getnodename() + "='"); system.out.print(attr.getnodevalue() + "'"); } } } /** * 筛选出节点类型为element_node 的节点 * @param nodelist * @return */ public static list<node> getnodelist(nodelist nodelist){ list<node> list = new linkedlist<>(); for (int i = 0,len = nodelist.getlength(); i < len; i++){ if(nodelist.item(i).getnodetype() == node.element_node){ list.add(nodelist.item(i)); } } return list; } }
2.sax解析
优点:
·采用事件驱动模式,对内存消耗比较小
·适用于只需处理xml中数据时
缺点:
·不易编码
·很难同时访问同一个xml中的多处不同数据
import org.xml.sax.attributes; import org.xml.sax.saxexception; import org.xml.sax.helpers.defaulthandler; import javax.xml.parsers.saxparser; import javax.xml.parsers.saxparserfactory; public class sax { public static void main(string[] args) throws exception { // 1.创建saxparserfactory对象 saxparserfactory saxparserfactory = saxparserfactory.newinstance(); // 2.通过saxparserfactory对象创建 saxparser saxparser saxparser = saxparserfactory.newsaxparser(); // 3.通过saxparser加载xml,并传入 defaulthandler 类型的对象进行解析 saxparser.parse("bean.xml", new saxparserhandler()); } static class saxparserhandler extends defaulthandler{ /** * 解析xml开始执行方法 * @throws saxexception */ @override public void startdocument() throws saxexception { super.startdocument(); system.out.print("============= sax开始解析xml =============\n"); } /** * 解析xml结束执行方法 * @throws saxexception */ @override public void enddocument() throws saxexception { super.enddocument(); system.out.print("\n============= sax结束解析xml ============="); } /** * 解析节点开始执行方法 * @param uri * @param localname * @param qname * @param attributes * @throws saxexception */ @override public void startelement(string uri, string localname, string qname, attributes attributes) throws saxexception { super.startelement(uri, localname, qname, attributes); system.out.print("<" + qname); for (int i = 0,len = attributes.getlength(); i < len; i++){ system.out.print(" " + attributes.getqname(i) + "='"); system.out.print(attributes.getvalue(i) + "'"); } system.out.print(">"); } /** * 解析节点结束执行方法 * @param uri * @param localname * @param qname * @throws saxexception */ @override public void endelement(string uri, string localname, string qname) throws saxexception { super.endelement(uri, localname, qname); system.out.print("</" + qname + ">"); } @override public void characters(char[] ch, int start, int length) throws saxexception { super.characters(ch, start, length); string str = new string(ch, start, length); system.out.print(str); } } }
3.jdom解析
特征:
·使用了具体类,不使用接口。
·api大量使用了collections类,源码开源
import org.jdom.attribute; import org.jdom.document; import org.jdom.element; import org.jdom.jdomexception; import org.jdom.input.saxbuilder; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.ioexception; import java.io.inputstream; import java.util.list; /** * <!-- 引入jdom依赖包 --> * <dependency> * <groupid>org.jdom</groupid> * <artifactid>jdom</artifactid> * <version>1.1</version> * </dependency> */ public class jdom { public static void main(string[] args) throws ioexception, jdomexception { // 1.创建saxbuilder对象 saxbuilder saxbuilder = new saxbuilder(); // 2.获取xml文件输入流 inputstream in = new fileinputstream("bean.xml"); // 3.通过saxbuilder对象的build方法,将xml文件输入流添加到saxbuilder对象中 document document = saxbuilder.build(in); // 4.获取xml根节点 element rootelement = document.getrootelement(); // 5.根据根节点解析xml printnodemsg(rootelement); } public static void printnodemsg(element element){ system.out.print("<" + element.getname()); // 获取节点的属性 printattrmsg(element); system.out.print(">\n"); list<element> elements = element.getchildren(); for (element e : elements){ if(e.getchildren().size() > 0){ printnodemsg(e); }else { system.out.print("<" + e.getname()); printattrmsg(e); system.out.print(">"); system.out.print(e.getvalue()); system.out.print("</" + e.getname() + ">\n"); } } system.out.print("</" + element.getname() + ">\n"); } /** * 获取节点的属性 * @param element */ public static void printattrmsg(element element){ list<attribute> attributes = element.getattributes(); for (attribute attribute : attributes){ system.out.print(" " + attribute.getname() + "='" + attribute.getvalue() + "'"); } } }
4.dom4j解析
特征:
·使用了接口和抽象基本类方法
·具有性能优异、灵活性好、功能强大和极端易用的特点。
·开源
import org.dom4j.attribute; import org.dom4j.document; import org.dom4j.documentexception; import org.dom4j.element; import org.dom4j.io.saxreader; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.util.iterator; /** * <!-- dom4j依赖包 --> * <dependency> * <groupid>dom4j</groupid> * <artifactid>dom4j</artifactid> * <version>1.6.1</version> * </dependency> */ public class dom4j { public static void main(string[] args) throws filenotfoundexception, documentexception { // 1.创建saxreader对象 saxreader saxreader = new saxreader(); // 2.通过saxreader对象的read方法,加载xml输入流 document document = saxreader.read(new fileinputstream("bean.xml")); // 3.通过document对象获取xml的根节点 element rootelement = document.getrootelement(); // 4.通过根节点解析xml printnodemsg(rootelement); } public static void printnodemsg(element element){ system.out.print("<" + element.getname()); // 获取节点的属性 printattrmsg(element); system.out.print(">\n"); iterator<element> elementiterator = element.elementiterator(); element e; while (elementiterator.hasnext()){ e = elementiterator.next(); if(e.elementiterator().hasnext()){ printnodemsg(e); }else { system.out.print("<" + e.getname()); printattrmsg(e); system.out.print(">"); system.out.print(e.getstringvalue()); system.out.print("</" + e.getname() + ">\n"); } } system.out.print("</" + element.getname() + ">\n"); } /** * 获取节点的属性 * @param element */ public static void printattrmsg(element element){ iterator<attribute> attributeiterator = element.attributeiterator(); attribute attribute; while (attributeiterator.hasnext()){ attribute = attributeiterator.next(); system.out.print(" " + attribute.getname() + "='" + attribute.getvalue() + "'"); } } }
推荐阅读
-
Python通过DOM和SAX方式解析XML的应用实例分享
-
java使用dom4j生成与解析xml文档的方法示例
-
java xml解析方式(DOM、SAX、JDOM、DOM4J)
-
java基础 xml 使用dom4j解析 xml文件 servlet根据pattern 找到class
-
java操作(DOM、SAX、JDOM、DOM4J)xml方式的四种比较与详解
-
dom4j解析XML时出现"java.lang.noclassdeffounderror: org/jaxen/jaxenexception"错误
-
dom4j解析XML时出现"java.lang.noclassdeffounderror: org/jaxen/jaxenexception"错误
-
Java程序员从笨鸟到菜鸟之(二十七)XML之Jdom和DOM4J解析 .
-
XML--jdom/dom4j/sax解析XML文件
-
Java基础之XML介绍与SAX解析、DOM解析XML、JDOM解析、DOM4J解析、XMLEncoder与XMLDecoder的使用以及xstream工具的使用 189~195