在上篇文章中,简单介绍了sax解析xml的一种方式,它是继承defaultHandler方式,并重写其中的几个方法来实现的。
接下来说的第二种方式是用RootElement这个类来解析的,RootElement 内置了defaultHandler的子类,
RootElement 源码如下:
public class RootElement extends Element { final Handler handler = new Handler(); /** * Constructs a new root element with the given name. * * @param uri the namespace * @param localName the local name */ public RootElement(String uri, String localName) { super(null, uri, localName, 0); } /** * Constructs a new root element with the given name. Uses an empty string * as the namespace. * * @param localName the local name */ public RootElement(String localName) { this("", localName); } /** * Gets the SAX {@code ContentHandler}. Pass this to your SAX parser. */ public ContentHandler getContentHandler() { return this.handler; } class Handler extends DefaultHandler { Locator locator; int depth = -1; Element current = null; StringBuilder bodyBuilder = null; @Override public void setDocumentLocator(Locator locator) { this.locator = locator; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { int depth = ++this.depth; if (depth == 0) { // This is the root element. startRoot(uri, localName, attributes); return; } // Prohibit mixed text and elements. if (bodyBuilder != null) { throw new BadXmlException("Encountered mixed content" + " within text element named " + current + ".", locator); } // If we're one level below the current element. if (depth == current.depth + 1) { // Look for a child to push onto the stack. Children children = current.children; if (children != null) { Element child = children.get(uri, localName); if (child != null) { start(child, attributes); } } } } void startRoot(String uri, String localName, Attributes attributes) throws SAXException { Element root = RootElement.this; if (root.uri.compareTo(uri) != 0 || root.localName.compareTo(localName) != 0) { throw new BadXmlException("Root element name does" + " not match. Expected: " + root + ", Got: " + Element.toString(uri, localName), locator); } start(root, attributes); } void start(Element e, Attributes attributes) { // Push element onto the stack. this.current = e; if (e.startElementListener != null) { e.startElementListener.start(attributes); } if (e.endTextElementListener != null) { this.bodyBuilder = new StringBuilder(); } e.resetRequiredChildren(); e.visited = true; } @Override public void characters(char[] buffer, int start, int length) throws SAXException { if (bodyBuilder != null) { bodyBuilder.append(buffer, start, length); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { Element current = this.current; // If we've ended the current element... if (depth == current.depth) { current.checkRequiredChildren(locator); // Invoke end element listener. if (current.endElementListener != null) { current.endElementListener.end(); } // Invoke end text element listener. if (bodyBuilder != null) { String body = bodyBuilder.toString(); bodyBuilder = null; // We can assume that this listener is present. current.endTextElementListener.end(body); } // Pop element off the stack. this.current = current.parent; } depth--; } } }
以上是RootElement类得源码,从源码可以看出,它只是将defaultHandler简单的处理一下。
具体应用可以参照我写的测试源码
/** * sax解析xml的第二种方式 * 用XMLReader 也是sax的一种方式 * @return */ private String saxParseSecond(){ //读取src下xml文件 InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("saxTest.xml"); SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser parse = factory.newSAXParser(); XMLReader reader = parse.getXMLReader(); reader.setContentHandler(getRootElement().getContentHandler()); reader.parse(new InputSource(inputStream)); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; }
/** * * @return 返回设置好处理机制的rootElement */ private RootElement getRootElement(){ /*rootElement代表着根节点,参数为根节点的tagName*/ RootElement rootElement = new RootElement("classes"); /*获取一类子节点,并为其设置相应的事件 * 这里需要注意,虽然我们只设置了一次group的事件,但是我们文档中根节点下的所有 * group却都可以触发这个事件。 * */ Element groupElement = rootElement.getChild("group"); // 读到元素开始位置时触发,如读到<group>时 groupElement.setStartElementListener(new StartElementListener() { @Override public void start(Attributes attributes) { // Log.i("TEST", "start"); String groupName = attributes.getValue("name"); String groupNum = attributes.getValue("num"); result = result+"groupName ="+groupName+"groupNum = "+groupNum+"\n"; } }); //读到元素结束位置时触发,如读到</group>时 groupElement.setEndElementListener(new EndElementListener() { @Override public void end() { } }); Element personElement = groupElement.getChild("person"); //读取<person>标签触发 personElement.setStartElementListener(new StartElementListener() { @Override public void start(Attributes attributes) { String personName = attributes.getValue("name"); String age = attributes.getValue("age"); result = result+"personName ="+personName+"age = "+age+"\n"; } }); //读取</person>标签触发 personElement.setEndElementListener(new EndElementListener() { @Override public void end() { } }); Element chinese = personElement.getChild("chinese"); // chinese.setTextElementListener(new TextElementListener() { // // @Override // public void end(String body) { // // TODO Auto-generated method stub // // } // // @Override // public void start(Attributes attributes) { // // TODO Auto-generated method stub // // } // }); // 读到文本的末尾时触发,这里的body即为文本的内容部分 chinese.setEndTextElementListener(new EndTextElementListener() { @Override public void end(String body) { Pattern p = Pattern.compile("\\s*|\t|\r|\n"); Matcher m = p.matcher(body); body = m.replaceAll(""); result = result+"chinese ="+body; } }); Element english = personElement.getChild("english"); english.setEndTextElementListener(new EndTextElementListener() { @Override public void end(String body) { Pattern p = Pattern.compile("\\s*|\t|\r|\n"); Matcher m = p.matcher(body); body = m.replaceAll(""); result = result+"english ="+body+"\n"; } }); return rootElement; }
我们都知道通过SAXParser对象解析xml的方式,这里我们又从代码中看到了利用另一个对象XMLReader进行解析,那么两者到底有什么联系和区别呢?
其实SAXParser是在SAX 1.0 定义的,而XMLReader则是在2.0中才开始出现的。你可以认为XMLReader的出现是为了替代SAXParser解析的,两者本质上干的事情是一样的,只不过XMLReader的功能更加的强悍而已。
关于XMLReader的获取方式,除了通过SAXParser的getXMLReader方法获得之外,我们还可以通过以下两种方式。
XMLReader parser=XMLReaderFactory.createXMLReader(); (1) XMLReader parser=XMLReaderFactory.createXMLReader(String className); (2)
以上就是android sax解析xml文件(二)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

XML在RSS中具有结构化数据、可扩展性、跨平台兼容性和解析验证的优势。1)结构化数据确保内容的一致性和可靠性;2)可扩展性允许添加自定义标签以适应内容需求;3)跨平台兼容性使其在不同设备上无缝工作;4)解析和验证工具确保Feed的质量和完整性。

RSS在XML中的实现方式是通过结构化的XML格式来组织内容。1)RSS使用XML作为数据交换格式,包含频道信息和项目列表等元素。2)生成RSS文件需按规范组织内容,发布到服务器供订阅。3)RSS文件可通过阅读器或插件订阅,实现内容自动更新。

RSS的高级功能包括内容命名空间、扩展模块和条件订阅。1)内容命名空间扩展RSS功能,2)扩展模块如DublinCore或iTunes添加元数据,3)条件订阅根据特定条件筛选条目。这些功能通过添加XML元素和属性实现,提升信息获取效率。

rssfeedsusexmltoStructureContentUpdates.1)xmlProvidesHierarchicalStructurefordata.2)theelementDefinestHefEed'sIdentityAndContainsElements.3)ElementsRementsRementsRepresSentividividividualContentpieces.4)rsssissisexisextensible,允许custemements.5)5)

RSS和XML是用于网络内容管理的工具。RSS用于发布和订阅内容,XML用于存储和传输数据。它们的工作原理包括内容发布、订阅和更新推送。使用示例包括RSS发布博客文章和XML存储书籍信息。

RSS文档是基于XML的结构化文件,用于发布和订阅频繁更新的内容。它的主要作用包括:1)自动化内容更新,2)内容聚合,3)提高浏览效率。通过RSSfeed,用户可以订阅并及时获取来自不同来源的最新信息。

RSS的XML结构包括:1.XML声明和RSS版本,2.频道(Channel),3.条目(Item)。这些部分构成了RSS文件的基础,允许用户通过解析XML数据来获取和处理内容信息。

RSSFEEDSUSEXMLTOSYNDICATECONTENT; PARSINGTHEMINVOLVESLOADINGINGINGINGINSSTRUCTURE,andExtractingData.ApplicationsIncludeBuildBuildingNewSagGregatorSaterNewSagGregatorSator andTrackingPodcastepodcastepisodes。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),