有的时候我们需要对XML进行读写操作,常用的XML操作主要有Streams和DOM方式。

一.Streams方式

Streams常用到的类主要有两个XmlStreamReader 以及XmlStreamWriter。

XmlStreamReader:此种读取方式的读的特点为从上而下读,下图是根据reader的EventType自上而下的运行步骤。

我们将此xml读取后封装到一个Goods的List中,Goods包括item,name以及type属性,代码如下:

/*
* 假定目前XML数据样式为:
*<?xml version="1.0"?>
*<goodsList>
*    <goods item="1">
*        <name>华为手机</name>
*        <type>华为</type>
*    </goods>
*    <goods item="2">
*        <name>小米手机</name>
*        <type>小米</type>
*    </goods>
*</goodsList>
* 需要将xml解析成Goods的一个List
*/
public class XmlReaderController {public class Goods {public String item{get;set;}public String name{get;set;}public String type{get;set;}}public List<Goods> getGoodsListByXmlFile(String goodsXml) {XmlStreamReader reader = new XmlStreamReader(goodsXml);Boolean flagXmlEnd = true;List<Goods> goodsList = new List<Goods>();while(flagXmlEnd) {Goods tempGoods;if(reader.getEventType() == XmlTag.START_ELEMENT) {if(reader.getLocalName().equalsIgnoreCase('goods')) {tempGoods = getGoods(reader);}}if(reader.hasNext()) {reader.next();} else {flagXmlEnd = false;break;}if(tempGoods != null) {goodsList.add(tempGoods);}}return goodsList;}Goods getGoods(XmlStreamReader reader) {Goods tempGoods = new Goods();tempGoods.item = reader.getAttributeValue(null,'item');Boolean flagIsLoop = true;while(flagIsLoop) {if(reader.hasNext()) {reader.next();if(reader.getEventType() == XmlTag.START_ELEMENT) {if(reader.getLocalName().equalsIgnoreCase('name')) {reader.next();tempGoods.name = reader.getText();} else if(reader.getLocalName().equalsIgnoreCase('type')) {reader.next();tempGoods.type = reader.getText();}}if(reader.getEventType() == XmlTag.END_ELEMENT && reader.getLocalName().equalsIgnoreCase('goods')) {flagIsLoop = false;break;}} else {flagIsLoop = false;break;}}return tempGoods;}
}

在匿名块测试方法:

String goodsXml = '<?xml version="1.0"?>' +'<goodsList>' +'<goods item="1">' +'<name>华为手机</name>' +'<type>华为</type>' +'</goods>' +'<goods item="2">' +'<name>小米手机</name>' +'<type>小米</type>' +'</goods>' +'</goodsList>';
List<XmlReaderController.Goods> goodsList = new XmlReaderController().getGoodsListByXmlFile(goodsXml);
System.debug(JSON.serialize(goodsList));

显示结果:

[
{
"type":"华为",
"name":"华为手机",
"item":"1"
},
{
"type":"小米",
"name":"小米手机",
"item":"2"
}

 XmlStreamWriter:处理过程同XmlStreamReader,需要从上到下进行写入,例如如果写出上述的xml文件,需要先startDocument,然后再startElement.....要注意每个start需要对应相应的end方法。

public class XmlWriterController {public static void writeXml() {XmlStreamWriter writer = new XmlStreamWriter();writer.writeStartDocument('utf-8','1.0');writer.writeComment('goodsList start here');writer.writeStartElement('','goodsList','http://www.goods.com');writer.writeNamespace('', 'http://www.goods.com'); writer.writeStartElement(null,'goods',null);writer.writeAttribute(null,null,'item','1');writer.writeStartElement(null,'name',null);writer.writeCharacters('华为手机');writer.writeEndElement();writer.writeStartElement(null,'type',null);writer.writeCharacters('华为');writer.writeEndElement();writer.writeEndElement();writer.writeStartElement(null,'goods',null);writer.writeAttribute(null,null,'item','2');writer.writeStartElement(null,'name',null);writer.writeCharacters('小米手机');writer.writeEndElement();writer.writeStartElement(null,'type',null);writer.writeCharacters('小米');writer.writeEndElement();writer.writeEndElement();writer.writeEndElement();writer.writeEndDocument();system.debug(writer.getXmlString());}
}

 二.Dom解析

dom解析原理同java对于dom解析相同,这里,goodsList作为根节点,goodsList的子节点有goods1,goods.他们分别有属性item1和item2,goods1以及goods2又分别有相应的子节点。

通过dom方式将上述xml解析成Goods的List。

public class DomXmlController {public class Goods {String item{get;set;}String name{get;set;}String type{get;set;}}public List<Goods> getGoodsViaXmlDom(String xmlString) {Dom.Document document = new Dom.Document();document.load(xmlString);Dom.XmlNode rootElement = document.getRootElement();List<Goods> goodsList = new List<Goods>();for(Dom.XmlNode node : rootElement.getChildElements()) {if(node.getName().equalsIgnoreCase('goods')) {Goods tempGoods = new Goods();tempGoods = getGoodsNameAndType(node);tempGoods.item = node.getAttribute('item',null);goodsList.add(tempGoods);}}return goodsList;}Goods getGoodsNameAndType(Dom.XmlNode parentNode) {transient Goods tempGoods = new Goods();for(Dom.XmlNode node : parentNode.getChildElements()) {if(node.getName().equalsIgnoreCase('name')) {tempGoods.name = node.getText();} else if(node.getName().equalsIgnoreCase('type')) {tempGoods.type = node.getText();}}return tempGoods;}
}

匿名块测试内容如下:

String goodsXml = '<?xml version="1.0"?>' +'<goodsList>' +'<goods item="1">' +'<name>华为手机</name>' +'<type>华为</type>' +'</goods>' +'<goods item="2">' +'<name>小米手机</name>' +'<type>小米</type>' +'</goods>' +'</goodsList>';
System.debug(JSON.serialize(new DomXmlController().getGoodsViaXmlDom(goodsXml)));

显示结果:

总结:apex对于xml操作和java很类似,或者说大部分都是从java过来的,如果java解析xml很娴熟情况下,使用apex解析xml只需要看看方法就OK了。本篇只是描述最简单的xml操作,篇中好多方法没有使用到,有兴趣的或者想深入的可以自己看一下相关的api。



转载于:https://www.cnblogs.com/zero-zyq/p/5601158.html

salesforce 零基础学习(三十二)通过Streams和DOM方式读写XML相关推荐

  1. salesforce 零基础学习(十八)WorkFlow介绍及用法

    说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ...

  2. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件

    在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...

  3. IM开发者的零基础通信技术入门(十二):上网卡顿?网络掉线?一文即懂!

    [来源申明]本文引用了微信公众号"鲜枣课堂"的<上网慢?经常掉线?这篇文章告诉你该怎么办!>文章内容.为了更好的内容呈现,即时通讯网在引用和收录时内容有改动,转载时请注 ...

  4. salesforce零基础学习(九十七)Big Object

    我们在salesforce学习工作中,接触到很多的 标准的 object ,自定义 object 以及外部object.我们使用SOQL / SOSL 进行搜索,熟知他们的各种limitation,查 ...

  5. python血条游戏代码_零基础快速学十二课Python完整游戏代码,使用「格式符%」来处理...

    十二课Python不同数据类型的拼接方式,使用[格式符%]来处理 不过它还没有全部解决:打印出每局结果,三局两胜打印最终战果.这就是版本3.0需要做的事情. 打印战果,三局两胜. 对比2.0版本,在3 ...

  6. salesforce 零基础学习(四十二)简单文件上传下载

    项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文 ...

  7. salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type)...

    本篇引用以下三个链接: http://www.tgerm.com/2012/01/recordtype-specific-picklist-values.html?m=1 https://github ...

  8. salesforce 零基础学习(三十四)动态的Custom Label

    custom label在项目中经常用到,常用在apex class或者VF里面用来显示help text或者error message.有的时候我们需要用到的信息是动态变化的,那样就需要动态来显示信 ...

  9. salesforce lightning零基础学习(三) 表达式的!(绑定表达式)与 #(非绑定表达式)

    在salesforce的classic中,我们使用{!expresion}在前台页面展示信息,在lightning中,上一篇我们也提及了,如果展示attribute的值,可以使用{!v.expresi ...

  10. Python学习基础笔记三十二——正则表达式

    官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特殊字符.及这些特定字符的组合,组成一个"规则字符串",这个规则字符串用来表达对字符串的一种过滤逻辑. 1. ...

最新文章

  1. ROS系统 用Python或C++实现发布者Publisher
  2. java数据类型,取值范围,引用类型解析
  3. 使用wdcp面板安装感恩教师节wordpress网站
  4. idea2021如何开启RunDashboard
  5. Spring中基于Java的配置@Configuration和@Bean用法
  6. 淘宝商品数据库设计的一些经验
  7. LeetCode 80. 删除排序数组中的重复项 II
  8. Windows10配置CUDA10.0+cudnn7.5.1
  9. 如何给table表格的tr行加border边框(解决篇)
  10. 机器学习笔记I: 基于逻辑回归的分类预测
  11. kNN算法__手写识别——基于Python和NumPy函数库
  12. Linux文件系统管理
  13. 人脸特征点定位——ASM和AAM算法
  14. C++、Java、JavaScript中的正则表达式
  15. 超级计算机排名太湖之光,神威•太湖之光继续“称霸”超级计算机排行榜 美国无缘前三...
  16. 禁用wordpress新编辑器,使用经典编辑器的方法
  17. java导出excel报表_java生成excel报表文件示例
  18. vue中的表单数据提交
  19. 如何用虚拟光驱给服务器装系统,怎样用虚拟光驱安装系统
  20. Python下进程同步之互斥锁、信号量、事件机制

热门文章

  1. iOS 通讯录编程【总结】
  2. Java记录 -89- java.lang.Class
  3. asp.net 页面转向 Response.Redirect, Server.Transfer, Server.Execute的区别
  4. php 字符串加,php字符串如何增加
  5. python如何删除对象属性_如何销毁python中属性中的对象?
  6. 能给别人吗_《奇葩说》观点引热议:一种能看透别人心思的能力,你敢要吗?...
  7. 汇编语言实模式到保护模式的思考
  8. Redis Scan返回数据量大于Limit的Count原因分析
  9. python高段编程_25个有用的 Python 代码段
  10. 设计模式之——建造者模式