浅谈XMl解析的几种方式

来源:互联网 发布:php 数组怎么赋值给js 编辑:程序博客网 时间:2024/05/18 00:01

1.XMl  简介:

“可扩展标记语言”(XML) 提供一种描述结构化数据的方法。与主要用于控制数据的显示和外观的 HTML 标记不同,XML 标记用于定义数据本身的结构和数据类型。

 

XML 使用一组标记来描绘数据元素。每个元素封装可能十分简单也可能十分复杂的数据。您可以定义一组无限制的 XML 标记。例如,您可以定义一些 XML 标记来声明订单中的数据,如价格、税收、发货地址、帐单地址等等。由于 XML 标记在整个单位中以及跨单位采用,因此来自各种不同数据存储区的数据将更容易交换和操作。

 

XML 是一种简单、与平台无关并被广泛采用的标准。XML 相对于 HTML 的优点是它将用户界面与结构化数据分隔开来。这种数据与显示的分离使得集成来自不同源的数据成为可能。客户信息、订单、研究结果、帐单付款、病历、目录数据及其他信息都可以转换为 XML。

方式

交互速度

可以解析

可以修改

特点

Dom

可以

可以

操作简单、读取大文件效率低

Sax

Dom

可以

不可以

可以读取大文件

JDom

Dom

可以

可以

Dom的可修改性与Sax文件读取特性的结合

Dom4j

Dom

可以

可以

Dom差不多

2.Dom操作xml:

2.1用Dom解析XML文档:

DOM的全称是DocumentObject Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档结构形成了一棵节点树。无论XML文档中所描述的是什么类型的信息,即便是制表数据、项目列表或一个文档,利用DOM所生成的模型都是节点树的形式。也就是说,DOM强制使用树模型来访问XML文档中的信息。由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的。
DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的。

Java代码:

package xml;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

import org.w3c.dom.NodeList;

/**

 * java中用Dom解析xml

 * @author PenghuiJia

 * 如何将java中的"\"替换为"\\"

 * replaceAll里面用的是正则表达式,所以字符串转义一次,

 * 正则转义一次,所以一个斜扛要写4个,用replaceAll( "\\\\ ",   "\\\\\\\\ "); *

 */

public class DOMDemo {

         public static void main(String args[]) throws Exception {

                   // step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器)

                   DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();

                   // step 2:获得具体的dom解析器 

                   DocumentBuilderbuilder=factory.newDocumentBuilder();

                   //获取用户当用户路径

                   Stringurl=System.getProperty("user.dir")+"\\src\\xml\\dom_demo_01.xml";

                   //将路径中\替换为\\

                   Stringrelurl=url.replaceAll("\\\\","\\\\\\\\");

                   // step3: 解析一个xml文档,获得Document对象(根结点) 

                   Documentdocument=builder.parse(newFile(relurl));

                   NodeListlist=document.getElementsByTagName("name");

                   // 输出节点

                   System.out.println("姓名:"+list.item(0).getFirstChild().getNodeValue());

         }

}

Xml代码:

<?xml version="1.0" encoding="GBK"?>

<addresslist>

         <linkman>

                   <name>贾鹏辉</name>

                   <email>penghui-jia@outlook.com</email>

         </linkman>

         <linkman>

                   <name>penghuijia</name>

                   <email>penghui-jia@outlook.com</email>

         </linkman>

</addresslist>

2.2用Dom创建XML文档:

package xml;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.transform.OutputKeys;

import javax.xml.transform.Transformer;

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;

 

/**

 *java中用Dom创建xml

 * @author PenghuiJia

 * 如何将java中的"\"替换为"\\"

 *replaceAll里面用的是正则表达式,所以字符串转义一次,

 * 正则转义一次,所以一个斜扛要写4个,用replaceAll( "\\\\",   "\\\\\\\\ ");

 *

 */

public class DomWriteDemo {

    public static void main(String args[])throws Exception {

       // step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器)

       DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();

       // step 2:获得具体的dom解析器 

       DocumentBuilderbuilder=factory.newDocumentBuilder();

       //获取用户当用户路径

       Stringurl=System.getProperty("user.dir")+"\\src\\xml\\output.xml";

       //将路径中\替换为\\

       Stringrelurl=url.replaceAll("\\\\","\\\\\\\\");   

       // step3: 创建一个新xml文档

       Documentdocument=builder.newDocument();

       ElementaddressList=document.createElement("addressList");

       Elementlinkman=document.createElement("linkman");

       Elementname=document.createElement("name");

       Elementemail=document.createElement("email");

       //添加节点内容

       name.appendChild(document.createTextNode("penghuijia"));

       email.appendChild(document.createTextNode("penghuijia@ph.com"));

       //设置各节点之间的关系

       linkman.appendChild(name);//namelinkname的子节点

       linkman.appendChild(email);//emaillinkname的子节点

       addressList.appendChild(linkman);

       document.appendChild(addressList);

       //setp4: 创建TransformerFactory实例

       TransformerFactorytf=TransformerFactory.newInstance();

       Transformert=tf.newTransformer();

       t.setOutputProperty(OutputKeys.ENCODING,"GBK");//设置文档编码

       DOMSourcedomSource=new DOMSource(document);//准备输出文档

       StreamResultstreamResult=new StreamResult(new File(relurl));

       t.transform(domSource,streamResult);

    }

}

3. SAX解析xml

SAX的全称是SimpleAPIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

package sax;

importjava.io.File;

importjavax.xml.parsers.* ;

public class TestSAX {

    public static void main(String args[])throws Exception {

       // step1获得SAX解析器工厂实例 

       SAXParserFactoryfactory = SAXParserFactory.newInstance() ;

        //step2: 获得SAX解析器实例 

       SAXParserparser = factory.newSAXParser() ;

       //获取用户当用户路径

       Stringurl=System.getProperty("user.dir")+"\\xml\\dom_demo_01.xml";

       //将路径中\替换为\\

       Stringrelurl=url.replaceAll("\\\\","\\\\\\\\");          

       File file=new File(relurl);

       //step3: 开始进行解析    

       parser.parse(file,new SaxTest()) ;

    }

}

package sax;

importorg.xml.sax.Attributes;

importorg.xml.sax.SAXException;

importorg.xml.sax.helpers.DefaultHandler;

 

public class SaxTest extends DefaultHandler {

    @Override

    public void startDocument() throwsSAXException {

       // TODOAuto-generated method stub

       System.out.println("<?xmlversion=\"1.0\" encoding=\"GBK\">");

    }

 

    @Override

    public void startElement(String uri, String localName,String qName,

           Attributesattributes) throws SAXException {

       // TODOAuto-generated method stub

       System.out.print("<");

       System.out.print(qName);

       //如果存在属性

       if (attributes!=null) {

           //遍历属性

           for (int i = 0; i < attributes.getLength(); i++) {

              //getQName获取属性名,getValue获取属性值

              System.out.print(""+attributes.getQName(i)+"=\""+attributes.getValue(i)+"\"");

           }

       }

       System.out.print(">");

    }

 

    @Override

    public void endElement(String uri, String localName,String qName)

           throws SAXException {

       // TODOAuto-generated method stub

       System.out.print("<") ;

       System.out.print(qName) ;

       System.out.print(">") ;

    }

 

    @Override

    public void characters(char[] ch,int start,int length)

           throws SAXException {

       // TODOAuto-generated method stub

       //格式化输出

       System.out.print(new String(ch,start,length)) ;

    }

 

    @Override

    public void endDocument() throwsSAXException {

       // TODOAuto-generated method stub

       System.out.print("\n文档结束!") ;

    }  

}

4.Jdom操作xml:

JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。(http://jdom.org)

•JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念等),把SAX和DOM的功能有效地结合起来。

•JDOM是用Java语言读、写、操作XML的新API函数。在直接、简单和高效的前提下,这些API函数被最大限度的优化。

使用Jdom操作xml很简单,必须先导入jdom.jar包(在jdom2.05)中是jdom2.05.jar.

4.1Jdom创建xml文档:

package jdom;

import java.io.File;

import java.io.FileOutputStream;

import org.jdom2.Attribute;

import org.jdom2.Document;

import org.jdom2.Element;

import org.jdom2.output.XMLOutputter;

public class WriteXML {

    public static void main(String args[])throws Exception {

       Elementaddresslist = new Element("addresslist") ;

       Elementlinkman = new Element("linkman") ;

       Elementname = new Element("name") ;

       Elementemail = new Element("email") ;

       Attributeid = new Attribute("id","473061") ;

       Documentdoc = new Document(addresslist) ;   //定义Document对象

       name.setText("PenghuiJia") ;

       name.setAttribute(id);  // 将属性设置到元素之中

       email.setText("penghui@163.com") ;

       linkman.addContent(name);  // 设置关系

       linkman.addContent(email);

       addresslist.addContent(linkman);

       XMLOutputterout = new XMLOutputter() ;

       out.setFormat(out.getFormat().setEncoding("GBK")) ; //表示的是设置编码

       //获取用户当用户路径

       Stringurl=System.getProperty("user.dir")+"\\xml\\address.xml";

       //将路径中\替换为\\

       Stringrelurl=url.replaceAll("\\\\","\\\\\\\\");      

       out.output(doc,new FileOutputStream(newFile(relurl))) ;

    }

}

4.2 Jdom解析xml文档:

package jdom;

import java.io.File;

import java.util.List;

import org.jdom2.Document;

import org.jdom2.Element;

import org.jdom2.input.SAXBuilder;

public class ReadXML {

    public static void main(String args[])throws Exception {

       SAXBuilderbuilder = new SAXBuilder() ;

       //获取用户当用户路径

       Stringurl=System.getProperty("user.dir")+"\\xml\\address.xml";

       //将路径中\替换为\\

       Stringrelurl=url.replaceAll("\\\\","\\\\\\\\");      

       Documentread_doc = builder.build(new File(relurl)) ;

       Elementroot = read_doc.getRootElement() ;    // 取得根

       Listlist = root.getChildren("linkman") ;//得到所有的linkman

       for(int x=0;x<list.size();x++){

           Elemente = (Element) list.get(x) ;

           Stringname = e.getChildText("name") ;//得到name子节点的内容

           Stringid = e.getChild("name").getAttribute("id").getValue();

           Stringemail = e.getChildText("email") ;

           System.out.println("--------------联系人 -------------") ;

           System.out.println("姓名:" + name +",编号:" + id) ;

           System.out.println("EMAIL" + email) ;

           System.out.println("-----------------------------------") ;

           System.out.println() ;

       }

    }

}

5.dom4j操作XML:

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的JavaXML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在哪个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包, Hibernate用它来读写配置文件。

Jdom一样使用dom4j操作xml文档首先需要导入dom4j-1.6.1.jar开发包。

5.1使用dom4j创建xml文档:

import java.io.File;

import java.io.FileOutputStream;

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.XMLWriter;

public class DOM4JWriter {

    public static void main(String args[])throws Exception {

       Documentdoc = DocumentHelper.createDocument() ;

       Elementaddresslist = doc.addElement("addresslist") ;  //现在定义一个根节点

       Elementlinkman = addresslist.addElement("linkman") ;

       Elementname = linkman.addElement("name") ;

       Elementemail = linkman.addElement("email") ;

       name.setText("xiaojia") ;

       email.setText("xj@xj.com") ;

       OutputFormatformat = OutputFormat.createPrettyPrint();

       format.setEncoding("GBK") ;

       //获取用户当用户路径

       Stringurl=System.getProperty("user.dir")+"\\xml\\address.xml";

       //将路径中\替换为\\

       Stringrelurl=url.replaceAll("\\\\","\\\\\\\\");      

       XMLWriterwriter = new XMLWriter(newFileOutputStream(new File(relurl)),format) ;

       writer.write(doc);  // 进行输出

       writer.close();

    }

}

5.2使用dom4j解析xml文档:

import java.io.File;

import java.util.Iterator;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

public class DOM4JReader {

    public static void main(String args[])throws Exception {

       //获取用户当用户路径

       Stringurl=System.getProperty("user.dir")+"\\xml\\address.xml";

       //将路径中\替换为\\

       Stringrelurl=url.replaceAll("\\\\","\\\\\\\\");      

       Filefile = new File(relurl) ;

       SAXReaderreader = new SAXReader() ;

       Documentdoc = reader.read(file);//读取XML文件

       // JDOM操作的时候是要取得根节点

       Elementroot = doc.getRootElement() ;  // 取得根节点

       // 现在应该根据根节点找到全部的子节点,linkman

       Iteratoriter = root.elementIterator() ;

       while(iter.hasNext()){

           Elementlinkman = (Element) iter.next() ;

           System.out.println("姓名:" + linkman.elementText("name")) ;

           System.out.println("邮件:" + linkman.elementText("email")) ;

       }

    }

}

7 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一岁宝宝过敏怎么办 母乳喂养宝宝不吃奶瓶怎么办 宝宝吃奶特别急怎么办 宝宝吃奶粉消化不良怎么办 喝羊奶大便干燥怎么办 宝宝换奶粉发烧怎么办 婴儿吃了蛋白怎么办 新生儿吃了蜂蜜怎么办 婴儿吃蜂蜜中毒怎么办 宝宝吃蜂蜜中毒怎么办 宝宝对蛋清过敏怎么办 宝宝吃蛋清过敏怎么办 婴儿吃蛋清过敏怎么办 初生婴儿拉水怎么办 婴儿鸡蛋过敏了怎么办 婴儿鸡蛋白过敏怎么办 母牛产后涨奶怎么办 宝宝吃奶时间长边吃边睡怎么办 宝宝吃海鲜过敏怎么办 小孩吃虾过敏怎么办 三个月婴儿不吃奶粉怎么办 宝宝秋季腹泻发烧怎么办 婴儿肚子有积食怎么办 小孩眼睛有点斜怎么办 孕妇血糖高便秘怎么办 宝宝蛋清过敏了怎么办 婴儿对鸡蛋过敏怎么办 宝宝断奶喝酸奶怎么办 宝宝被异物卡住怎么办 宝宝夜里膝盖痛怎么办 宝宝吃蛋白过敏怎么办 身体蛋白率低怎么办 孕妇喝酸奶呕吐怎么办 哺乳期得了寻麻疹怎么办 新生儿一定要抱睡怎么办 伊可新外壳吃了怎么办 Ddrop斜着倒了怎么办 ddrops滴多了怎么办 ddrops d3吃过量怎么办 ddrops吃多了怎么办 刚出生婴儿长牙怎么办