如何解析XML数据?有哪些方法?

上回我们说到 JSON 解析的四种方式,那么这次我们来看看 XML 的四种解析方式。解析的四种方式DOM 解析SAX 解析JDOM 解析DOM4J 解析案例实操

大家好,今天来为大家解答如何解析XML数据?有哪些方法?这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

案例实操

DOM 解析

DOM(Document Object Model,文档对象模型),在应用程序中,基于DOM的XML解析器将XML文档转换成对象模型的集合(通常称为DOM树),应用程序就是它就是通过操作这个对象模型来实现对XML文档数据的操作。 XML本身是以树的形式出现的,所以在操作DOM时,也会以树的形式进行转换。在整个DOM树中,最大的地方是Document,它代表一个只有一个根节点的文档。

注意:使用DOM操作时,每个文本区域也是一个节点,称为文本节点。

核心操作界面

DOM解析中有以下四个核心操作接口:

Document:该接口代表整个XML文档,代表整个DOM树的根。它提供了访问和操作文档中数据的入口。 XML文件中的所有元素内容都可以通过Document节点访问。

Node:这个接口在整个DOM树中起着重要的作用。 DOM操作的核心接口很大一部分都是继承自Node接口。例如:Document、Element等接口。在DOM 树中,每个Node 接口代表DOM 树中的一个节点。

NodeList:该接口表示节点的集合,一般用来表示一组具有顺序关系的节点,例如:当文档发生变化时,某个节点的子节点会直接影响NodeList集合。

NamedNodeMap:该接口表示一组节点与其唯一名称之间的一一对应关系。该接口主要用于表示属性节点。

DOM解析过程

如果程序需要进行DOM解析和读取操作,还需要遵循以下步骤:

创建DocumentBuilderFactory : DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); 创建DocumentBuilder: DocumentBuilder builder=factory.newDocumentBuilder(); 创建文档: Document doc=builder.parse(“需要解析的文件路径”); 创建NodeList 3336 0NodeList nl=doc.getElementsByTagName(“读取节点”); 读取XML 信息

SAX 解析

SAX(Simple API for XML)解析按照xml文件的顺序逐步执行。 SAX 没有官方标准机构。它不属于任何标准组织或团体,也不属于任何公司或个人。它提供了一种可供任何人使用的计算机技术。

SAX(Simple API for XML,操作XML的简单接口)。与DOM操作不同,SAX采用顺序模式进行访问,这是一种快速读取XML数据的方式。当使用SAX解析器进行操作时,会触发一系列的事情。当扫描到文档(document)的开头和结尾以及元素(element)的开头和结尾时,就会调用相关的处理方法,这些操作方法会做出相应的动作。继续,直到扫描整个文档。

如果要实现这种SAX解析,必须首先构建一个SAX解析器。

//1. 创建解析器工厂SAXParserFactoryfactory=SAXParserFactory.newInstance(); //2. 获取解析器SAXParser parser=factory.newSAXParser(); //SAX解析器,继承DefaultHandlerString path=new File(‘resource/demo01 .xml’).getAbsolutePath();//解析parser.parse(path, new MySaxHandler());

JDOM 解析

W3C本身提供了XML操作标准、DOM和SAX。不过,从开发的角度来看,DOM和SAX本身都有各自的特点。 DOM可以修改,但不适合读取大文件,而SAX可以读取文件很大,但不能修改。所谓JDOM=DOM可修改+SAX可读取大文件。 JDOM 本身是一个免费的开源组件,可以直接从www.jdom.org 下载。

JDOM操作xml的常用类:

如何解析XML数据?有哪些方法?

Document:代表整个xml文档,是一个树形结构

Eelment:代表一个xml元素,并提供操作其子元素的方法,如文本、属性和命名空间等。

属性:表示元素包含的属性

Text:表示xml文本信息

XMLOutputter:xml输出流,底层通过JDK流实现

Format:提供xml文件输出的编码、样式和排版设置

我们发现JDOM的输出操作比传统的DOM方便、直观很多,包括输出。此时观察到的是JDOM对DOM解析的支持,不过也据说JDOM本身也支持SAX的特性;因此,SAX可以用于解析操作。

//获取SAX 解析器SAXBuilder builder=new SAXBuilder();File file=new File(‘resource/demo01.xml’); //获取文档Document doc=builder.build(new File(file.getAbsolutePath())) ; //获取根节点Element root=doc.getRootElement(); System.out.println(root.getName()); //获取根节点下的所有子节点。还可以根据标签名称直接获取指定的ListElement。 list=root.getChildren();System.out.println(list.size());for(int x=0; xlist.size(); x++){ 元素e=list.get(x); //获取元素的名称和里面的文本String name=e.getName(); System.out.println(name + ‘=’ + e.getText()); System.out.println(‘==================’);}

DOM4J 解析

dom4j 是一个简单的开源库,用于处理XML、XPath 和XSLT。它基于Java平台,采用Java的集合框架,全面集成了DOM、SAX和JAXP。下载路径:

http://www.dom4j.org/dom4j-1.6.1/

http://sourceforge.net/projects/dom4j

DOM4J和JDOM一样,都是一个免费的XML开源组件,但是由于该技术广泛应用在目前的开发框架中,比如Hibernate、Spring等,都使用了DOM4J的功能,所以作为介绍,大家可以有一个了解该组件的。没有谁更好或更坏。一般框架使用DOM4J较多,但如果我们在日常生活中需要使用的话,JDOM更常见。你可以发现DOM4J开发了很多新功能,比如输出格式。

File file=new File(‘resource/outputdom4j.xml’);SAXReader reader=new SAXReader();//将文件读取为文档Document doc=reader.read(file);//获取文档的根元素Element root=doc.getRootElement();//根据元素查找所有子节点IteratorElement iter=root.elementIterator();while(iter.hasNext()){ Element name=iter.next(); System.out.println(‘值=’+name.getText());}

扩展~XML的创建

DOM 创建

如果要生成XML 文件,则应在创建文档时使用newDocument() 方法

如果要输出DOM文档,那就相当麻烦了。一次写入多份

public static void createXml() throws Exception{ //获取解析器工厂DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //获取解析器DocumentBuilder builder=factory.newDocumentBuilder(); //创建文档Document doc=builder.newDocument() ; //创建元素并设置关系Element root=doc.createElement(‘people’);元素person=doc.createElement(‘person’);元素名称=doc.createElement(‘name’);元素年龄=doc.createElement(‘年龄’); name.appendChild(doc.createTextNode(‘lebyte’)); Age.appendChild(doc.createTextNode(’10’)); doc.appendChild(根); root.appendChild(人);人。追加子对象(名称); person.appendChild(年龄); //写出来//获取变压器工厂TransformerFactory tsf=TransformerFactory.newInstance();变压器ts=tsf.newTransformer(); //设置编码ts.setOutputProperty(OutputKeys.ENCODING , ‘UTF-8’); //创建一个带有DOM节点的新输入源,充当转换Source树的持有者DOMSource source=new DOMSource(doc); //作为转换结果的持有者File file=new File(‘src/output.xml’); StreamResult 结果=new StreamResult(文件); ts.transform(源,结果); }

SAX 创建

//创建SAXtransformerfactory对象SAXTransformerFactory stf=(SAXTransformerFactory) SAXTransformerFactory.newInstance(); try { //通过SAXTransformerFactory对象创建TransformerHandler对象TransformerHandler handler=stf.newTransformerHandler(); //通过transformerHandler对象创建变压器对象Transformer tf=handler.getTransformer(); //设置Transformer对象的属性tf.setOutputProperty(OutputKeys.ENCODING, ‘UTF-8’); tf.setOutputProperty(OutputKeys.INDENT, ‘是’); //创建一个结果对象,将其与处理程序关联File file=new File(‘src/output.xml’); if(!file.exists()){ file.createNewFile(); } 结果result=new StreamResult(new FileOutputStream(file) ); handler.setResult(结果); //通过Handler写入XML内容//打开文档handler.startDocument(); AttributesImpl attr=new AttributesImpl(); //创建根节点bookstore handler.startElement(”, ” , ‘bookstore’, attr); attr.clear(); attr.addAttribute(”, ”, ‘id’, ”, ‘1’); handler.startElement(”, ”, ‘book’, attr); attr.clear(); handler.startElement(”, ”, ‘name’, attr); handler.characters(‘颈椎病康复指南’.toCharArray(), 0, ‘颈椎病康复指南’.length()); handler.endElement(”,”,’name’); //关闭每个节点handler.endElement(”, ”, ‘book’); handler.endElement(”, ”, ‘书店’); handler.endDocument();} catch (SAXException e) { //TODO 自动生成的catch 块e.printStackTrace();} catch (FileNotFoundException e) { //TODO 自动生成的catch 块e.printStackTrace ();} catch (IOException e) { //TODO 自动生成的catch 块e.printStackTrace();} catch (TransformerConfigurationException e) { //TODO 自动生成的catch 块e.printStackTrace();}

用户评论

如何解析XML数据?有哪些方法?
仰望幸福

这篇文章真是太棒了!我之前一直苦恼于如何解析 XML 数据,看了你的文章一下子豁然开朗。没想到有那么多种解析方法,原来可以使用 Python 的 Beautiful Soup 库,还有 Java 的 DOM Parser 等等。我赶紧去学习一下了!

    有7位网友表示赞同!

如何解析XML数据?有哪些方法?
夏日倾情

XML 解析确实挺重要的,特别是现在很多时候数据都是用 XML 格式存储的。不过这篇文章讲的内容比较基础,对于一些高级的解析技巧还是不太详细。比如说对于非常大的 XML 文件来说,如何优化解析速度?有没有什么高效的工具推荐?

    有17位网友表示赞同!

如何解析XML数据?有哪些方法?
伱德柔情是我的痛。

我一直在学习网站开发,XML 解析经常会碰到。这篇文章介绍的方法都挺好理解的,特别是解释了 DOMParser 和 SAX 两种方式的区别,这点对我很有帮助!

    有10位网友表示赞同!

如何解析XML数据?有哪些方法?
念旧是个瘾。

对这些编程语言和库的了解真令人眼花缭乱!感觉自己还差好多,需要加深学习啊。XML 解析确实很重要,以后可以多关注一下这方面的新技术和方法。

    有17位网友表示赞同!

如何解析XML数据?有哪些方法?
残留の笑颜

我一直用的 JSON 格式处理数据,因为相对来说简单易懂。这次看到 XML 也可以用Python解析,看来我得重新学习一下了。JSON 和 XML 的区别在哪呢?哪个更好?

    有10位网友表示赞同!

如何解析XML数据?有哪些方法?
半世晨晓。

文章不错,把主要几种方式都介绍了。我觉得对于初学者来说,最好先从 SAX 开始入门,然后再逐渐了解 DOMParser。因为SAX的优点是内存占用小,能够处理大的XML文件,而DOMparser则更加方便查看XML结构。

    有15位网友表示赞同!

如何解析XML数据?有哪些方法?
一点一点把你清空

这篇博客太棒了!我之前一直在为 XML 数据解析头疼,看了你的介绍后终于明白是怎么回事了。最吸引我的地方是提到了 XSLT,这是一种非常强大的功能。以后有机会学习一下。

    有11位网友表示赞同!

如何解析XML数据?有哪些方法?
面瘫脸

我也遇到过 XML 解析的问题,特别是处理那些带有错误的 XML 文档的时候。文章里面提到的正则表达式和错误处理的方法很有用!

    有16位网友表示赞同!

如何解析XML数据?有哪些方法?
|赤;焰﹏゛

感觉解析方法很多,的确有点眼花缭乱。我建议在文章中加入一些代码示例,具体演示每种方式如何操作,这样更容易理解。

    有6位网友表示赞同!

如何解析XML数据?有哪些方法?
回到你身边

我比较喜欢 DOMParser 的方式,因为它可以方便地访问 XML 文档树的每个节点,更适合于处理结构复杂的 XML 文件。

    有12位网友表示赞同!

如何解析XML数据?有哪些方法?
关于道别

XML 解析确实一项重要的技能,特别是在软件开发领域,对于数据交换和信息存储都很有用处。建议文章中能够加入一些实际项目实例,让读者更好地理解在哪些情况下应该使用哪种解析方法。

    有19位网友表示赞同!

如何解析XML数据?有哪些方法?
白恍

现在很多人都说 JSON 更方便用,但是 XML 还是有它独特之处,比如它的结构化特性和扩展性比较好。所以学习 XML 解析依然很有价值!

    有19位网友表示赞同!

如何解析XML数据?有哪些方法?
青瓷清茶倾城歌

这篇文章介绍的比较全面,涵盖了 XML 解析的基础知识和几种常用方法,对于初学者来说非常有用。希望后续还有更多文章分享更深入的技术细节

    有19位网友表示赞同!

如何解析XML数据?有哪些方法?
绳情

XML 虽然看起来有点复杂,但是掌握解析方法后可以用它构建很多精彩的功能。我最近想学习一下使用 XML 和 XSLT 来实现数据模板化。 希望以后的文章继续分享一些实用案例!

    有9位网友表示赞同!

如何解析XML数据?有哪些方法?
封锁感觉

我原来以为 XML 这种格式早就过时了,没想到现在还在被广泛使用!这篇文章让我明白到即使是古老的技术,也依然有它的意义和价值。

    有13位网友表示赞同!

如何解析XML数据?有哪些方法?
柠夏初开

我觉得文章讲得比较客观,没有过于鼓吹某一种解析方法。介绍的几种方式各有优缺点,能够帮助读者根据实际情况选择合适的方案。

    有19位网友表示赞同!

如何解析XML数据?有哪些方法?
青墨断笺み

我之前对 XML 解析还不是很了解,看了这篇文章之后感觉豁然开朗了许多,至少知道应该从哪方面开始学习了!<br>

    有16位网友表示赞同!

如何解析XML数据?有哪些方法?
。婞褔vīp

XML 的文档格式的确很好用,可以把数据组织的非常清晰,而且有很多标准规范。 这篇文章介绍了一些常用的解析方法,对于想学习 XML 数据处理的人来说很实用

    有9位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/179595.html

(0)
小su's avatar小su
上一篇 2024年9月22日 下午7:03
下一篇 2024年9月22日 下午7:16

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注