xml数据解析

XML Pull Parser(使用Android的XmlPullParser)

原理

Pull Parser允许应用程序代码从XML数据中"拉取"事件,而不是像SAX那样通过事件处理程序被"推送"。应用程序代码可以决定何时拉取下一个事件,如开始元素、结束元素或文本内容。

优点
  • 高效内存使用:不需要加载整个文档到内存中。
  • 控制权:应用程序可以控制解析过程。
缺点
  • 与平台绑定:如Android的XmlPullParser,它并非Java标准库的一部分。
Java代码示例(Android)

|---|----------------------------------------------------------------------------------------|
| | import org.xmlpull.v1.XmlPullParser; |
| | import org.xmlpull.v1.XmlPullParserException; |
| | import java.io.StringReader; |
| | |
| | public class XmlPullParserExample { |
| | |
| | public void parseXml(String xmlString) throws XmlPullParserException, IOException { |
| | XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); |
| | factory.setNamespaceAware(true); |
| | XmlPullParser xpp = factory.newPullParser(); |
| | |
| | xpp.setInput(new StringReader(xmlString)); |
| | int eventType = xpp.getEventType(); |
| | String tagName = null; |
| | |
| | while (eventType != XmlPullParser.END_DOCUMENT) { |
| | switch (eventType) { |
| | case XmlPullParser.START_TAG: |
| | tagName = xpp.getName(); |
| | // 处理开始标签 |
| | break; |
| | case XmlPullParser.END_TAG: |
| | tagName = xpp.getName(); |
| | // 处理结束标签 |
| | break; |
| | case XmlPullParser.TEXT: |
| | // 处理文本内容 |
| | break; |
| | // 其他情况... |
| | } |
| | eventType = xpp.next(); |
| | } |
| | } |
| | } |

SAX Parser

原理

SAX Parser是一个基于事件的解析器,它读取XML文档并触发一系列事件,如开始元素、结束元素和字符数据。应用程序需要实现一个ContentHandler接口来处理这些事件。

优点
  • 高效内存使用:不需要加载整个文档到内存中。
  • 适用于大型XML文件。
缺点
  • 编程模型复杂:需要编写事件处理代码。
  • 不能回溯或修改解析的数据。
Java代码示例

|---|----------------------------------------------------------------------------------------------------------------------|
| | import javax.xml.parsers.SAXParser; |
| | import javax.xml.parsers.SAXParserFactory; |
| | import org.xml.sax.Attributes; |
| | import org.xml.sax.SAXException; |
| | import org.xml.sax.helpers.DefaultHandler; |
| | |
| | public class SaxParserExample extends DefaultHandler { |
| | |
| | @Override |
| | public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { |
| | // 处理开始标签 |
| | } |
| | |
| | @Override |
| | public void endElement(String uri, String localName, String qName) throws SAXException { |
| | // 处理结束标签 |
| | } |
| | |
| | @Override |
| | public void characters(char[] ch, int start, int length) throws SAXException { |
| | // 处理文本内容 |
| | } |
| | |
| | public void parseXml(String xmlString) throws SAXException, IOException, ParserConfigurationException { |
| | SAXParserFactory factory = SAXParserFactory.newInstance(); |
| | SAXParser parser = factory.newSAXParser(); |
| | |
| | parser.parse(new InputSource(new StringReader(xmlString)), this); |
| | } |
| | } |

注意:上述代码中的InputSource类需要从javax.xml.transform.stream.InputSource导入,并且你需要处理ParserConfigurationException异常。同时,SAXParser和SAXParserFactory都位于javax.xml.parsers包中。

相关推荐
hasty4 天前
policy.xml 在,不代表策略生效:ImageMagick 补丁给安全配置验收的提醒
xml·mysql·安全
泡海椒7 天前
JQuick-Excel JQuickRow 数据准备实战:JObjectConverter、JQuickRow.toRows 与 XML 导出链路
xml·windows·excel
泡海椒9 天前
JQuick-Excel 字段映射实战:用 MAPPING 固化 Excel 表头与业务字段契约
xml·java·开发语言·excel
执明wa22 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio
wl851122 天前
SAP CPI 教程004 如何通过groovy修改XML节点属性值
xml
码匠许师傅24 天前
【C++三方组件】TinyXML2:两个文件的极简 XML 解析器
xml·c++
yuzhiboyouye25 天前
my-batisPlus什么时候用xml什么时候用mapper自带的方法,这两种写法专业一点叫什么,什么场景分别使用
xml
筝筝ba1 个月前
如何跳过FFDC
xml·linux·运维·服务器·网络
yuzhiboyouye1 个月前
那xml对应的sql语法,列举一下
xml·数据库·sql
筝筝ba1 个月前
OpenBMC 自动化测试中的多进程陷阱:从 Execute Process 返回异常到 output.xml 损坏问题分析
xml·linux·运维·服务器·网络