加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

四种方法解析XML文档:Dom、SAX、JDOM、dom4j

发布时间:2020-12-16 08:29:44 所属栏目:百科 来源:网络整理
导读:四种方法解析XML文档:Dom、SAX、JDOM、dom4j 1 、了解XML: XML ,即可 扩展标记语言( ExtensibleMarkupLanguage ),标准通用标记语言的子集 ,一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对自己的

四种方法解析XML文档:Dom、SAX、JDOM、dom4j


1、了解XML:

XML,即可扩展标记语言(ExtensibleMarkupLanguage),标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。它和JSON都是一种数据交换格式。

作用:解析XML文档,创建XML文档。

2、什么是可扩展标记语言?

·可扩展标记语言是一种很像超文本标记语言的标记语言。

·它的设计宗旨是传输数据,而不是显示数据。

·它的标签没有被预定义。您需要自行定义标签。

·它被设计为具有自我描述性。

·它是W3C的推荐标准


3、解析XML文档的四种方式四种方法解析XML文档:Dom、SAX、JDOM、dom4j


第一种:DOM的全称是DocumentObjectModel,也即文档对象模型。在应用程序中,基于DOMXML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。


第一种:DOMXML文件读取:

1.DocumentBuilderFactory.newInstance()创建DocumentBuilderFactory的对象

2.DocumentBuilder获得具体的DOM解析器。

3.Parse(newFile())获取文档xml路径。


—————看注释


准备XML文档:

[java] view plain copy
print ?
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <Languagescat="it">
  3. <lanid="1">
  4. <name>Java</name>
  5. <ide>Eclipse</ide>
  6. </lan>
  7. <lanid="2">
  8. <name>Swift</name>
  9. <ide>Xcode</ide>
  10. <lanid="3">
  11. <name>C#</name>
  12. <ide>VisualStudio</ide>
  13. </Languages>

看看DOM解析的例子:

copy
packagedom;
  • importjava.io.File;
  • importjava.io.IOException;
  • importjavax.xml.parsers.DocumentBuilder;
  • importjavax.xml.parsers.DocumentBuilderFactory;
  • importjavax.xml.parsers.ParserConfigurationException;
  • importorg.w3c.dom.Document;
  • importorg.w3c.dom.Element;
  • importorg.w3c.dom.Node;
  • importorg.w3c.dom.NodeList;
  • importorg.xml.sax.SAXException;
  • /*
  • *DOMClassReader
  • *
  • */
  • publicclassReaderXML{
  • staticvoidmain(String[]args){
  • try{
  • //1。获取DOM解析器的工厂实例。
  • DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
  • //2。获得具体的DOM解析器。
  • DocumentBuilderbuilder=factory.newDocumentBuilder();
  • //3。获取文件
  • Documentdocument=builder.parse(newFile("languages.xml"));
  • //4。获取根元素
  • Elementroot=document.getDocumentElement();
  • System.out.println("cat="+root.getAttribute("cat"));
  • //5。获取根节点[有多个节点]
  • NodeListlist=root.getElementsByTagName("lan");
  • for(inti=0;i<list.getLength();i++){
  • //Nodelan=list.item(i);
  • //System.out.println("id="+lan.getNodeType());
  • System.out.println("---------------");
  • Elementlan=(Element)list.item(i);
  • System.out.println("id="+lan.getAttribute("id"));
  • //获取子节点集合
  • NodeListclist=lan.getChildNodes();
  • intj=0;j<clist.getLength();j++){
  • //获取下标
  • Nodec=clist.item(j);
  • //把空格删除[获取属性名和值]
  • if(cinstanceofElement){
  • System.out.println(c.getNodeName()+"="+c.getTextContent());
  • }
  • }
  • }catch(ParserConfigurationExceptione){
  • e.printStackTrace();
  • catch(SAXExceptione){
  • catch(IOExceptione){
  • }

  • 第一种:DOMXML文件创建:

    1.DocumentBuilderFactory.newInstance()获取DOM解析器的工厂实例。

    2.DocumentBuilder获得具体的DOM解析器。

    3.创建一个xml文档,获得Document对象(根结点)createElement

    4.创建根元素、根结点、setAttribute("根结点名");

    5.添加根节点的值:setTextContent(“Value”);

    6.子节点添加到根节点:appendChild(“根结点”);

    7.输出:TransformerFactory!

    copy
    importjava.io.File;
  • importjava.io.StringWriter;
  • importjavax.xml.parsers.DocumentBuilder;
  • importjavax.xml.parsers.DocumentBuilderFactory;
  • importjavax.xml.parsers.ParserConfigurationException;
  • importjavax.xml.transform.Transformer;
  • importjavax.xml.transform.TransformerException;
  • importjavax.xml.transform.TransformerFactory;
  • importjavax.xml.transform.dom.DOMSource;
  • importjavax.xml.transform.stream.StreamResult;
  • /*
  • *DOMClassGreat
  • *
  • */
  • classCreat_XML{
  • voidmain(String[]ags){
  • DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
  • Documentdocument=builder.newDocument();
  • //创建属性名、赋值
  • Elementroot=document.createElement("Languages");
  • root.setAttribute("cat","it");
  • //创建第一个根节点、赋值
  • Elementlan=document.createElement("lan");
  • lan.setAttribute("id","1");
  • Elementname=document.createElement("name");
  • name.setTextContent("java");
  • Elementide=document.createElement("IDE");
  • ide.setTextContent("Eclipse");
  • lan.appendChild(name);
  • lan.appendChild(ide);
  • <spanstyle="font-size:14px;"></span><prename="code"class="java">//创建第二个根节点、赋值
  • Elementlan2=document.createElement("lan");
  • lan2.setAttribute("id","2");
  • Elementname2=document.createElement("name");
  • name2.setTextContent("Swift");
  • Elementide2=document.createElement("ide");
  • ide2.setTextContent("XCode");
  • lan2.appendChild(name2);
  • lan2.appendChild(ide2);
  • //添加到属性中、
  • root.appendChild(lan);
  • root.appendChild(lan2);
  • document.appendChild(root);
  • //定义了用于处理转换指令,以及执行从源到结果的转换的
  • TransformerFactorytransformerFactory=TransformerFactory.newInstance();
  • Transformertransformer=transformerFactory.newTransformer();
  • transformer.setOutputProperty("encoding","UTF-8");
  • StringWriterwriter=newStringWriter();
  • transformer.transform(newDOMSource(document),newStreamResult(writer));
  • System.out.println(writer.toString());
  • transformer.transform(newStreamResult(newFile("newxml.xml")));
  • catch(ParserConfigurationException|TransformerExceptione){
  • }
  •  
    

    第二种:dom4j是一个JavaXMLAPI,类似于jdom,用来读写XML文件的dom4j是一个十分优秀的JavaXMLAPI,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBMdeveloperWorks上面还可以找到一篇文章,对主流的JavaXMLAPI进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML特别值得一提的是连SunJAXM也在用dom4j。这已经是必须使用的jar包,Hibernate也用它来读写配置文件。

    下载:dom4j架包

    第二种:Dom4j创建XML步骤:

    1.设置根节点:DocumentHelper.createElement("根节点名");

    2.读取doucment元素:DocumentHelper.createDocument(root);

    3.添加根节点:addAttribute("name","value");

    4.添加字节点、赋值:addElement("name");setText("value");

    5.添加到根节点:XMLWriterxmlWriter=newXMLWriter();xmlWriter.write(document);

    copy
    packagedom4j;
  • importjava.io.FileOutputStream;
  • importorg.dom4j.Document;
  • importorg.dom4j.DocumentHelper;
  • importorg.dom4j.Element;
  • importorg.dom4j.io.OutputFormat;
  • importorg.dom4j.io.XMLWriter;
  • classGreate_dom4j{
  • voidmain(String[]args)throwsException
  • {
  • //创建文档并设置文档的根元素节点
  • Elementroot=DocumentHelper.createElement("books");
  • Documentdoucment=DocumentHelper.createDocument(root);
  • //根节点
  • root.addAttribute("name","bookvalue");
  • //子节点
  • Elementelement1=root.addElement("author1");
  • element1.addAttribute("name","James1");
  • element1.addAttribute("location1","UK1");
  • element1.addText("JamesStrachan1");
  • Elementelement=root.addElement("author2");
  • element.addAttribute("name","chen");
  • element.addAttribute("kenken","ZK");
  • element.addText("chenkenken");
  • //添加
  • XMLWriterxmlwriter2=newXMLWriter();
  • xmlwriter2.write(doucment);
  • //创建文件
  • OutputFormatformat=newOutputFormat();
  • FileOutputStreamfile=newFileOutputStream("books.xml");
  • XMLWriterxml=newXMLWriter(file);
  • xml.close();
  • }

  • 第二种:om4j读取XML步骤:

    1.获取SAM接口:SAXReadersaxReader=newSAXReader();

    2.获取XML文档:Documentdoc=saxReader.read(newFile("name.xml"));

    3.获取根节点:Elementroot=doc.getRootElement();

    4.获取子节点:root.elementIterator();

    5.获取孙节点:attributeIterator();


    copy
    importjava.util.Iterator;
  • importjava.util.List;
  • importorg.dom4j.Attribute;
  • importorg.dom4j.Document;
  • importorg.dom4j.io.SAXReader;
  • *dom4jClassReader
  • classRreader_dom4j{
  • throwsException{
  • //1.获取SAM接口:
  • SAXReadersaxReader=newSAXReader();
  • //2.获取XML文件:
  • Documentdoc=saxReader.read(newFile("newxml.xml"));
  • //3.获取根节点:
  • Elementroot=doc.getRootElement();
  • System.out.println("根节点:"+root.getName());
  • System.out.println("----------------");
  • //获取子节点
  • Iterator<?>it=root.elementIterator();
  • while(it.hasNext()){
  • Elementelem=(Element)it.next();
  • //获取属性名属性值
  • List<Attribute>li=elem.attributes();
  • for(Attributeatt:li){
  • System.out.println(att.getName()+""+att.getValue());
  • //获取子节的子节点
  • Iterator<?>ite=elem.elementIterator();
  • while(ite.hasNext()){
  • Elementchild=(Element)ite.next();
  • System.out.println(child.getName()+""+child.getStringValue());
  • System.out.println("----------------");


  • 第三种:JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念等),把SAXDOM的功能有效地结合起来。

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

    JDOM读取XML:

    copy
    packagecom.jdom;
  • importjava.io.FileInputStream;
  • importjava.io.FileNotFoundException;
  • importjava.io.InputStream;
  • importjava.io.InputStreamReader;
  • importjava.io.UnsupportedEncodingException;
  • importjava.util.List;
  • importorg.jdom2.Attribute;
  • importorg.jdom2.Document;
  • importorg.jdom2.Element;
  • importorg.jdom2.JDOMException;
  • importorg.jdom2.input.SAXBuilder;
  • /**
  • *JDOMClassReader
  • classReaderJDom{
  • try{
  • //1.创建一个SAXBuilder的对象
  • SAXBuildersaxBuilder=newSAXBuilder();
  • //2.创建一个输入流,将xml文件加载到输入流中
  • InputStreamin=newFileInputStream("Book.xml");
  • InputStreamReaderisr=newInputStreamReader(in,0); background-color:inherit">//3.通过saxBuilder的build方法,将输入流加载到saxBuilder中
  • Documentdocument=saxBuilder.build(isr);
  • //4.通过document对象获取xml文件的根节点
  • ElementrootElement=document.getRootElement();
  • //5.获取根节点下的子节点的List集合
  • List<Element>elementList=rootElement.getChildren();
  • for(Elementelement:elementList){
  • //解析文件的属性集合
  • List<Attribute>list=element.getAttributes();
  • for(Attributeattr:list){
  • //获取属性名
  • StringattrName=attr.getName();
  • //获取属性值
  • StringattrValue=attr.getValue();
  • System.out.println(attrName+"="+attrValue);
  • //对book节点的子节点的节点名以及节点值的遍历
  • List<Element>listChild=element.getChildren();
  • for(Elementchild:listChild){
  • System.out.println(child.getName()+"="+child.getValue());
  • System.out.println("——————————————————————");
  • }catch(FileNotFoundExceptione){
  • e.printStackTrace();
  • catch(UnsupportedEncodingExceptione){
  • catch(JDOMExceptione){
  • catch(IOExceptione){
  • JDOM创建xml:

    copy

    importjava.io.IOException;
  • importorg.jdom2.Document;
  • importorg.jdom2.Element;
  • importorg.jdom2.output.Format;
  • importorg.jdom2.output.XMLOutputter;
  • *CreateClass
  • classCreateJDom{
  • //1.生成一个根节点
  • Elementrss=newElement("Languages");
  • //2.为节点添加属性
  • rss.setAttribute("Cat",0); background-color:inherit">//3.生成一个document对象
  • Documentdocument=newDocument(rss);
  • //添加元素
  • Elementlan=newElement("lan");
  • Elementname=newElement("name");
  • name.setText("java");
  • lan.addContent(name);
  • ElementIDE=newElement("IDE");
  • IDE.setText("eclipse");
  • lan.addContent(IDE);
  • rss.addContent(lan);
  • Elementlan2= lan2.setAttribute("id",108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> Elementname2= name2.setText("C#");
  • lan.addContent(name2);
  • ElementIDE2= IDE2.setText("VisualStudio");
  • lan2.addContent(IDE2);
  • rss.addContent(lan2);
  • //格式换行、编码
  • Formatformat=Format.getCompactFormat();
  • format.setIndent("");
  • format.setEncoding("GBK");
  • //4.创建XMLOutputter的对象
  • XMLOutputteroutputer=newXMLOutputter(format);
  • //5.利用outputer将document对象转换成xml文档
  • outputer.output(document,newFileOutputStream(newFile("Booknews.xml")));

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

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    • 推荐文章
        热点阅读