Android中的xml解析

一、绪论

        上周工作需要了解项目的一些大体内容,结果在xml解析这一块看的迷迷糊糊的,所以在这里把学习到xml解析的一些知识记录一下。

二、分析    

        http://www.php.cn/wiki/1502.html” target=”_blank”>android中的xml解析器主要有三种,DOM解析器、SAX解析器和pull解析器。

1、DOM解析器

        DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问XML文档的各个部分。它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。 缺点是加载大文档时效率低下,所以一般在解析大文档时不建议使用DOM解析。

    分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。Android完全支持DOM 解析。利用DOM中的对象,可以对XML文档进行读取、搜索、修改、添加和http://www.php.cn/wiki/1502.html” target=”_blank”>android0等操作。

        DOM的工作原理:使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素、http://www.php.cn/wiki/1502.html” target=”_blank”>android1和http://www.php.cn/wiki/1502.html” target=”_blank”>android2等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档。

        常用的DOM的http://www.php.cn/wiki/1502.html” target=”_blank”>android3和类:

Document:该接口定义分析并创建DOM文档的一系列方法,它是http://www.php.cn/wiki/1502.html” target=”_blank”>android4的根,是操作DOM的基础。

Node:该接口提供处理并获取节点和子节点值的方法。

Element:该接口http://www.php.cn/wiki/1502.html” target=”_blank”>android5Node接口,提供了获取、修改XML元素名字和属性的方法。

Nodehttp://www.php.cn/wiki/1502.html” target=”_blank”>android6:提供获得节点个数和当前节点的方法。这样就可以迭代地访问各个节点。

DOMParser:该类是Apache的Xerces中的DOM解析器类,可直接解析XML文件。

2、SAX解析

        SAX(Simple http://www.php.cn/wiki/1502.html” target=”_blank”>android7 http://www.php.cn/wiki/1502.html” target=”_blank”>android8 XML) 使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以http://www.php.cn/wiki/1502.html” target=”_blank”>android9为Document0的XML API,解析速度快,占用内存少。使用Document1来实现。 缺点是因为以事件为驱动的它不能回退。

        它的核心是Document2模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的Document3。

        SAX的工作原理:SAX会顺序扫描文档,在扫描到文档(document)开始与结束、元素(element)开始与结束、元素内容(characters)等时通知事件处理方法,事件处理方法进行相应处理,然后继续扫描,指导文档扫描结束。

        常用的SAX接口和类:

Attrbutes:用于得到属性的个数、名字和值。

ContentHanDocument4er:定义与文档本身关联的事件(例如,开始和结束标记)。大多数应用程序都注册这些事件。

Document5Handler:定义与DTD关联的事件。它没有定义足够的事件来完整地报告DTD。如果需要对DTD进行语法分析,请使用可选的DeclHandler。

DeclHandler是SAX的扩展。不是所有的语法分析器都支持它。

EntityResolver:定义与装入实体关联的事件。只有少数几个应用程序注册这些事件。

ErrorHandler:定义错误事件。许多应用程序注册这些事件以便用它们自己的方式报错。

DefaultHandler:它提供了这些接LI的缺省实现。在大多数情况下,为应用程序扩展DefaultHandler并覆盖相关的方法要比直接实现一个接口更容易。

         下面是部分说明:

Android中的xml解析

SAX处理器说明

Android中的xml解析

部分常用方法说明

        所以,我们通常要使用XmlReader和DefaultHandler配合起来解析xml文档。

        SAX的解析流程:

startDocument –> startElement –> characters –> Document6Element –> endDocument

3、pull解析

        Pull内置于Android系统中。也是官方解析布局文件所使用的方式。Pull与SAX有点类似,都提供了类似的事件,如开始元素和结束元素。不同的是,SAX的事件驱动是回调相应方法,需要提供回调的方法,而后在SAX内部自动调用相应的方法。而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。Android官方推荐开发者们使用Pull解析技术。Pull解析技术是第三方开发的开源技术,它同样可以应用于JavaSE开发。

        pull返回的Document7:

读取到xml的声明返回 START_DOCUMENT;

读取到xml的结束返回 END_DOCUMENT ;

读取到xml的开始标签返回 START_TAG;

读取到xml的结束标签返回 END_TAG;

读取到xml的文本返回 TEXT;

        pull的工作原理:pull提供了开始元素和结束元素。当某个元素开始时,我们可以调用parser.Document8Text从XML文档中提取所有字符数据。当解释到一个文档结束时,自动生成EndDocument事件。

        常用的XML pull的接口和类:

XmlPullParser:XML pull解析器是一个在XMLPULL VlAP1中提供了定义解析功能的接口。

XmlSerializer:它是一个接口,定义了XML信息集的序列。

XmlPullParserFactory:这个类用于在XMPULL V1 API中创建XML Pull解析器。

XmlPullParserDocument9:抛出单一的XML pull解析器相关的错误。

        pull的解析流程:

start_document –> end_document –> start_tag –>end_tag

在Android中还有第四种方式:android.util.Xml类 (本人未使用过)

        在Android API中,另外提供了Android.util.Xml类,同样可以解析XML文件,使用方法类似SAX,也都需编写Handler来处理XML的解析,但是在使用上却比SAX来得简单 ,如下所示:

        以android.util.XML实现XML解析 :

MyHandler myHandler=new MyHandler0;

android.util.Xm1.parse(url.openC0nnection().getlnputStream(),Xml.Encoding.UTF-8,myHandler);

三、实践

        1、首先建立一个参考xml文档  (放在了asObject0s目录中)

                                       灵渠在广西壮族自治区兴安县境内,是世界上最古老的运河之一,有着“世界古代水利建筑明珠”的美誉。灵渠古称秦凿渠、零渠、陡河、兴安运河,于公元前214年凿成通航,距今已2217年,仍然发挥着功用。                                          http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg                                                          胶莱运河南起黄海灵山海口,北抵渤海三山岛,流经现胶南、胶州、平度、高密、昌邑和莱州等,全长200公里,流域面积达5400平方公里,南北贯穿山东半岛,沟通黄渤两海。胶莱运河自平度姚家村东的分水岭南北分流。南流由麻湾口入胶州湾,为南胶莱河,长30公里。北流由海仓口入莱州湾,为北胶莱河,长100余公里。                                                    http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg                                                                  位于淮河下游江苏省北部,西起洪泽湖边的高良涧,流经洪泽,青浦、淮安,阜宁、射阳,滨海等六县(区),东至扁担港口入海的大型人工河道。全长168km。                                                                http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg                      

我们需要用一个River对象来保存数据,方便观察节点信息,抽象出River类

public Object1 River {

Object2 name;// 名称

Object3 length;// 长度

String introduction;// 介绍

String Imageurl;// Object4url

public String getName() {

Object5 name;

}

public void setName(String name) {

this.name = name;

}

public Integer getLength() {

return length;

}

public void setLength(Integer length) {

this.length = length;

}

public String getIntroduction() {

return introduction;

}

public void setIntroduction(String introduction) {

this.introduction = introduction;

}

public String getImageurl() {

return Imageurl;

}

public void setImageurl(String imageurl) {

Imageurl = imageurl;

}

@Override

public String toString() {

return “River [name=” + name + “, length=” + length + “, introduction=”

+ introduction + “, Imageurl=” + Imageurl + “]”;

}

}

采用DOM解析时具体处理步骤是:

1 首先利用DocumentBuilderFactory创建一个DocumentBuilderFactory实例

2 然后利用DocumentBuilderFactory创建DocumentBuilder

3 然后加载XML文档(Document),

4 然后获取文档的根结点(Element),

5 然后获取根结点中所有子节点的列表(NodeList),

6 然后使用再获取子节点列表中的需要读取的结点。

下面我们就开始读取xml文档对象,并添加进List中:

代码如下: 我们这里是使用assets中的river.xml文件,那么就需要读取这个xml文件,返回输入流。 读取方法为:inputStream=this.context.getObject6s().getAssets().open(Object7Name); 参数是xml文件路径,当然默认的是assets目录为根目录。

然后可以用DocumentBuilder对象的parse方法解析输入流,并返回document对象,然后再遍历doument对象的节点属性。

/**     * DOM解析xml方法    

 * @param filePath    

 * @return    

 */    

private ListDOMfromXML(String filePath) {        

Object8Listlist = new ArrayList();

DocumentBuilderFactory factory = Object9;

DocumentBuilder builder = null;

Document document = null;

InputStream inputStream = null;

//构建解析器

factory = DocumentBuilderFactory.newInstance();

try {

builder = factory.newDocumentBuilder();

//找到xml文件并且加载

inputStream = this.getResources().getAssets().open(filePath);//getAssets后默认根目录为assets

document = builder.parse(inputStream);

//找到根Element

Element root=document.getDocumentElement();

NodeList nodes=root.Model0(RIVER);

//遍历根节点所有子节点,rivers 下所有river

River river = null;

for (int i = 0; i

river = new River();

//获取river元素节点

Element riverElement = (Element) nodes.item(i);

//设置river中name和length属性值

river.setName(riverElement.getAttribute(“name”));

river.setLength(Integer.parseInt(riverElement.getAttribute(“length”)));

//获取子标签

Element introduction = (Element) riverElement.getElementsByTagName(INTRODUCTION).item(0);

Element imageurl = (Element) riverElement.getElementsByTagName(IMAGEURL).item(0);

//设置introduction和imageurl属性

river.setIntroduction(introduction.getFirstChild().getNodeValue());

river.setImageurl(imageurl.getFirstChild().getNodeValue());

list.add(river);

}

} catch (ParserConfigurationException e) {

// TODO Auto-generated catch block

e.Model1StackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SAXException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

for (River river : list) {

Log.w(“DOM Test”, river.toString());

}

return list;

}

在这里添加到List中, 然后我们使用log将他们打印出来。如图所示:

Android中的xml解析

XML解析结果

采用SAX解析时具体处理步骤是:

1 创建SAXParserFactory对象

2 根据SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器

3 根据SAXParser解析器获取事件源对象XMLReader

4 实例化一个DefaultHandler对象

5 连接事件源对象XMLReader到事件处理类DefaultHandler中

6 调用XMLReader的parse方法从输入源中获取到的xml数据

7 通过DefaultHandler返回我们需要的Model2合。

代码如下:

/**    

 * SAX解析xml    

 * @param filePath    

 * @return    

 */    

private ListSAXfromXML(String filePath) {        

ArrayListlist = new ArrayList();

//构建解析器

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = null;

XMLReader xReader = null;

try {

parser = factory.newSAXParser();

//获取数据源

xReader = parser.getXMLReader();

//设置处理器

RiverHandler handler = new RiverHandler();

xReader.setContentHandler(handler);

//解析xml文件

xReader.parse(new InputSource(this.getAssets().open(filePath)));

list = handler.getList();

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

for (River river : list) {

Log.w(“DOM Test”, river.toString());

}

return list;

}

以上就是Android中的xml解析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1428991.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 02:01:03
下一篇 2025年12月17日 02:02:30

相关推荐

  • 什么是CDATA区块?何时需要使用?

    <blockquote>CDATA区块用于在XML中保留特殊字符原义,避免转义;适用于嵌入代码等含大量特殊字符的文本,提升可读性,但不可嵌套、不能用于属性值,且需防范安全风险。</blo…

    用户投稿 2026年5月10日
    100
  • XML中如何删除重复属性_XML删除重复属性的方法与技巧

    答案:可通过Python或XSLT处理XML重复属性问题。首先利用ElementTree遍历元素,用字典保留首个属性值并清除重复项,再递归处理子元素;同时建议在数据生成阶段避免拼接错误,确保属性唯一性,从而保障XML合规。 在处理XML文档时,有时会遇到元素包含重复属性的情况。虽然XML规范允许解析…

    2026年5月10日
    100
  • 使用PHP和SimpleXML解析XML数据并动态生成HTML表格

    本文将指导您如何利用php的simplexml扩展和xpath查询,高效地解析xml文件中的结构化数据,并将其动态渲染为html表格。通过修正常见的xpath使用误区,确保数据按预期层级准确展示,实现xml数据到网页表格的无缝转换。 理解XML数据结构 在处理XML数据之前,首先需要清晰地理解其结构…

    2026年5月10日
    000
  • XML编码声明重要吗?

    XML编码声明非常重要,它是确保文件正确解析的关键。它作为字节与字符之间的映射桥梁,明确告知解析器应使用何种编码读取文件。若声明缺失或与实际编码不一致,可能导致乱码或解析失败。根据XML 1.0规范,无声明时默认按UTF-8处理,但若文件实际编码为GBK等其他格式,便会出错。因此,必须在生成或编辑X…

    2026年5月10日
    000
  • 什么是XPath?如何定位XML节点?

    XPath是一种在XML/HTML文档中精准定位节点的语言,通过路径表达式、属性、文本内容及轴(如父、兄弟节点)实现灵活查找。它优于CSS选择器之处在于支持向上遍历、基于文本定位和复杂逻辑判断,适用于自动化测试、爬虫等场景,但需避免脆弱性、性能问题和可读性差等陷阱。编写健壮的XPath应优先使用唯一…

    2026年5月10日
    000
  • XML注释的语法格式是什么?

    XML注释以结束,用于添加不影响解析的说明性内容,提升文档可读性与维护性。1. 注释不可含连续两个连字符(–),否则会导致XML解析错误,而HTML对此较宽容。2. 应侧重解释“为什么”而非“是什么”,避免冗余。3. 可用于模块分隔、临时禁用配置、标记待办事项等高级用途,增强大型文档结构…

    2026年5月10日
    000
  • python如何解析html_使用Python解析HTML文档数据【数据】

    Python解析HTML有五种常用方法:一、BeautifulSoup(易用,容错强);二、lxml(高性能,支持XPath);三、PyQuery(jQuery语法,可读性好);四、正则表达式(轻量,适用于简单固定结构);五、html.parser(内置,需手动处理事件)。 如果您需要从HTML文档…

    2025年12月23日
    000
  • BeautifulSoup教程:解决HTML内容中标签查找返回None的问题

    在使用BeautifulSoup进行网页解析时,开发者常会遇到标签查找返回`None`或空列表的问题,这通常是由于对HTML结构理解不准确或查找方法使用不当所致。本文将深入探讨BeautifulSoup查找机制,分析常见错误原因,并提供一套系统的解决方案,包括精确的标签定位策略、HTML结构检查技巧…

    2025年12月23日
    000
  • R语言教程:使用stringr包高效解析复杂字符串并提取结构化数据

    本教程详细介绍如何在r语言中,利用`stringr`包结合正则表达式,从包含html或xml片段的复杂字符串列中高效提取特定结构化数据。文章通过实际案例演示了如何使用`str_extract_all`和`str_replace_all`函数,精准定位并抽取所需信息,最终将非结构化文本转化为可分析的数…

    2025年12月23日
    000
  • 使用Python和BeautifulSoup从HTML页面提取H3标签文本

    本教程详细介绍了如何利用python的`requests`库获取网页内容,并结合`beautifulsoup`库高效解析html,精准提取所有` `标签内的文本信息。文章将提供清晰的步骤、完整的代码示例以及重要的注意事项,帮助开发者轻松实现网页数据抓取,适用于需要从复杂html结构中定位特定元素并提…

    2025年12月23日
    100
  • 利用R语言和正则表达式从字符串中提取特定变量

    本文旨在指导读者如何使用R语言的`stringr`包结合正则表达式,从包含复杂文本(如HTML片段)的字符串中高效地提取特定数据并将其结构化为新的数据框列。教程将通过具体示例,详细讲解从原始文本中匹配、提取和清洗目标值的过程,帮助用户掌握处理非结构化文本数据的实用技巧。 在数据分析实践中,我们经常会…

    2025年12月23日
    000
  • HTML数据怎样进行文本挖掘 HTML数据文本分析的技术路线

    答案:文本挖掘需先清洗HTML获取正文,再经预处理、特征提取后进行分析。具体为:1. 用requests和BeautifulSoup抓取并解析HTML,去除噪声;2. 清理残留符号、分词、去停用词等;3. 采用TF-IDF或词嵌入向量化;4. 实施主题建模、情感分析等任务,关键在于精准提取与合理建模…

    2025年12月23日
    000
  • JavaScript Regex:修复HTML中标签的闭合问题

    JavaScript Regex:修复HTML中标签的闭合问题JavaScript Regex:修复HTML中标签的闭合问题JavaScript Regex:修复HTML中标签的闭合问题JavaScript Regex:修复HTML中标签的闭合问题

    本教程详细介绍了如何使用JavaScript正则表达式,识别并修复HTML代码中缺少自闭合斜杠的“的标签,并演示如何通过替换操作为其添加正确的闭合格式,从而标准化HTML结构。 背景与挑战 在处理html字符串时,有时会遇到一些标签格式不规范的情况,例如:在捕获组的内容之后,添加一个空格和正确的自…

    2025年12月23日 用户投稿
    000
  • 解决React/JSX中SVG命名空间标签不支持问题:转换策略与实践

    在React/JSX应用中嵌入SVG图标时,开发者常会遇到Namespace tags are not supported by default错误。这通常是由于SVG文件包含xmlns:或prefix:attribute等XML命名空间语法,而JSX解析器默认不支持此类标签。核心解决方案是将这些命…

    2025年12月23日
    000
  • JavaScript:操作通过 innerHTML 动态添加的 HTML 元素

    本文旨在解决如何访问和操作通过 JavaScript 的 innerHTML 属性动态添加到 DOM 中的 HTML 元素。我们将探讨使用 DOMParser 解析 HTML 字符串,以及如何有效地选取和修改这些动态生成的元素,避免常见的 TypeError 错误,并提供优化建议。 当使用 Java…

    2025年12月23日
    000
  • XPath复杂文本节点提取策略:利用substring-after精确解析

    本教程深入探讨XPath在复杂HTML结构中提取特定文本节点时遇到的常见问题,特别是当text()函数未能如预期工作时。文章解释了XPath 1.0中text()行为的细微差别,并提供了一种基于substring-after函数的实用解决方案,以精确高效地定位并提取目标文本,即使它被其他元素或文本节…

    2025年12月22日
    000
  • 使用BeautifulSoup精确抓取特定链接:多类选择与属性提取最佳实践

    本文详细介绍了如何利用Python的BeautifulSoup库进行网页抓取时,高效且健壮地定位具有特定CSS类组合的标签,并从中提取href属性。通过实例代码,文章演示了如何使用find_all方法结合类列表进行精确匹配,并推荐使用get()方法安全地获取链接,避免因属性缺失引发错误,从而提升爬虫…

    2025年12月22日
    200
  • BeautifulSoup高级技巧:带条件判断的HTML元素提取与占位符填充

    本文详细介绍了如何使用Python的BeautifulSoup库处理HTML解析中遇到的条件性元素缺失问题。通过结合CSS选择器和Python列表推导式中的条件判断,我们可以高效地提取目标数据,并在特定条件不满足时,自动插入自定义的占位符(如空字符串),从而确保输出数据结构的完整性和一致性。 1. …

    2025年12月22日
    000
  • BeautifulSoup精准提取:解决div干扰与优化列表数据抓取

    本文旨在解决使用BeautifulSoup从网页中提取列表数据时,因中间出现div等其他标签导致提取不完整的问题。我们将探讨如何通过调整选择器范围,利用find_all方法或CSS选择器,实现对指定区域内所有目标元素的准确、高效抓取,尤其适用于处理复杂或非连续的HTML结构,确保数据提取的完整性与鲁…

    2025年12月22日
    000
  • HTML注释怎么在XML中使用_XML文档中注释的写法规则

    答案:HTML与XML注释语法相同,均为,但XML禁止注释内出现双连字符–,否则会导致解析错误,而HTML对此较宽容;两者均继承自SGML,解析器会忽略注释内容,主要用于文档说明和临时禁用代码,XML注释更严格以确保数据解析无歧义。 HTML注释在XML中是完全兼容且通用的,两者都采用 …

    2025年12月22日
    000

发表回复

登录后才能评论
关注微信