Scala学习十六——XML处理
一.本章要点
- XML字面量<like>this</like>的类型为NodeSeq
- 可以在XML字面量中内嵌Scala代码
- Node的child属性产出后代节点
- Node的attributes属性产出包含节点属性的MetaData对象
- \和\\操作符执行类Xpath匹配
- 可以在case语句中使用XML字面量匹配节点模式
- 使用带有RewriteRule示例的RuleTransformer来变换某个节点的后代
- XML对象利用Java的XML相关方法实现XML文件的加载和保存
- ConstructingParser是另一个可以使用的解析器,它会保留注释和CDATA节
二.XML字面量
Scala对XML有内建支持。例:
//类型为scala.xml.Elem
val doc=<html><head><title>Test</title></head></html>
//类型为scala.xml.NodeSeq
val item=<li>Test1</li><li>Test2</li>
三.XML节点
Node是所有XML节点类型的祖先,两个重要的子类Text和Elem
四.元素属性
要处理某个元素的属性键和值,可以使用attributes属性,会产生一个MetaData对象,类似于映射。但是产出的是一个节点序列,而不是字符串。。。
五.内嵌表达式
可以在XML字面量中包含Scala代码块,动态计算元素的内容。如果代码块产出一个节点序列,序列中的节点会被直接添加到XML,所有其他值都会被放到一个Atom[T]中,这是一个针对类型T的容器,通过data属性取值。。。
六.在属性中使用表达式
可以用Scala表达式计算属性值,内嵌的代码块也可以产出一个序列。。。
七.特殊节点处理
有能时需要将非XML文本包含到XML文档中,需要在XML字面量中使用CDATA标记。。。
八.类xPath表达式
NodeSeq类提供了类似Xpath中的/和//操作符方法。由于//表示注释,Scala用\和\\替换。
\操作符定位于某个节点或节点序列的直接后代。
\\操作符定位于任何深度的后代。
九.模式匹配
可以在模式匹配中使用XML字面量。。。
十.修改元素和属性
在Scala中,XML节点和节点序列是不可变的如果想要编辑一个节点,则必须创建一个拷贝,给出需要的修改,然后拷贝未被显示修改的部分。
要拷贝Elem节点,用copy方法,有五个参数:label,attributes,child,还有用于命名空间的prefix和scope。
十一.XML变换
XML类库提供了一个RuleTransforms类可以将一个或多个RewriteRule实例应用到某个节点及其后代(需要重写所有满足某个特定条件的后代)。。。
十二.加载和保存
要从文件中加载XML文档,调用XNL对象的loadFile方法:
import scala.xml.XML
val root=XML.loadFile("xx.xml")
也可以从java.io.InputStream.java.io.Reader或URL加载:
val root2=XML.load(new FileInputStream("xx.xml"))
val root3=XML.load(new InputStreamreader(new FileInputStream("xx.xml"),"UTF-8")) val root4=XML.load(new URL("https://...."))
注:文档使用标准的SAX解析器加载(没有提供文档类型定义);
Scala还提供了一个解析器,可以保留注释、CDATA节和空白(scala.xml.parsing.ConstructingParser)
。。。
十三.命名空间
类似于Java/C++中,命名空间用来避免名称冲突。
XML命名空间是一个URL,使用xmlns声明一个命名空间。。。
十四.练习
Scala学习十六——XML处理的更多相关文章
- Scala学习十八——高级类型
一.本章要点 单例类型可用于方法串接和带对象参数的方法 类型投影对所有外部类的对象都包含了其他内部类的实例 类型别名给类型指定一个短小的名称 结构类型等效于”鸭子类型“ 存在类型为泛型的通配参数提供了 ...
- Scala学习十四——模式匹配和样例类
一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...
- Scala学习十——特质
一.本章要点 类可以实现任意数量的特质 特质可以要求实现它们的类具备特定的字段,方法或超类 和Java接口不同,Scala特质可以提供方法和字段实现 当你将多个特质叠加在一起时,顺序很重要——其方法先 ...
- 强化学习(十六) 深度确定性策略梯度(DDPG)
在强化学习(十五) A3C中,我们讨论了使用多线程的方法来解决Actor-Critic难收敛的问题,今天我们不使用多线程,而是使用和DDQN类似的方法:即经验回放和双网络的方法来改进Actor-Cri ...
- Scala学习十九——解析
一.本章要点 文法定义中的二选一.拼接.选项和重复在Scala组合子解析器中对应|.~.opt和rep 对于RegexParsers而言,字符串字面量和正则表达式匹配的是词法单元 用^^来处理解析结果 ...
- Scala学习十二——高阶函数
一.本章要点 在Scala中函数是”头等公民“(可以作为参数,返回值,赋值给其他); 可以创建匿名函数,通常还会交给其他函数; 函数参数可以给出需要稍后执行的行为; 许多集合方法都接受函数参数,将函数 ...
- Scala学习十五——注解
一.本章要点 可以为类.方法.字段.局部变量.参数.表达式.类型参数以及各种类型定义添加注解 对于表达式和类型,注解跟在被注解的条目之后 注解的形式有@Annotation.@Annotation(v ...
- Java开发学习(十六)----AOP切入点表达式及五种通知类型解析
一.AOP切入点表达式 对于AOP中切入点表达式,总共有三个大的方面,分别是语法格式.通配符和书写技巧. 1.1 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法 切入点表达式:要进行增 ...
- BizTalk开发系列(十六) XML命名空间
BizTalk开发过程中如果有对XML进行开发操作,比如在自定义代码里操作XML消息或者在Mapping的时候使用Xpath对XML进行操 作.则有机会遇到XML命名空间的问题.常见的是使用Xpath ...
随机推荐
- 使用sequelize-auto 生成mysql 表的实体时主键没有 autoIncrement: true 属性
使用sequelize-auto 生成mysql 表时主键没有 autoIncrement: true 属性,这会导致插入数据时报错.看git上面是已经解决了的,解决方法是修改查询语句模板.我用的是0 ...
- Java-基于 Instrument 的 Agent
Agent 为 JVMTI 的客户端. 这里记录的是基于Java Instrument 的 Agent 实现,还有直接基于 JVMTI 的 Agent 实现. 在 JDK1.5 以后,我们可以使用 A ...
- nginx - nginx下配置thinkphp5
首先tp5的访问目录指向到webroot/public文件夹中.thinkphp的url访问:http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数 ...
- MySQL 判断数据库和数据表是否存在
MySQL 判断数据库和数据表是否存在 如何使用SQL查询语句,判断数据库和数据表是否存在? 1.判断数据库是否存在 查询SQL如下: select * from information_schema ...
- 用Keras搭建神经网络 简单模版(六)——Autoencoder 自编码
import numpy as np np.random.seed(1337) from keras.datasets import mnist from keras.models import Mo ...
- Ubuntu+Django+uWSGI+Nginx部署Django项目
安装uWSGI,pip依据自己要使用的python版本自行选择,python2.x版本使用pip进行安装,python3.x版本使用pip3进行安装 pip install uwsgi 配置uWSGI ...
- 【Fiori系列】为什么SAP Fiori活的如此精致
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]为什么SAP Fiori活的如 ...
- 集群架构03·MySQL初识,mysql8.0环境安装,mysql多实例
官方网址 https://dev.mysql.com/downloads/mysql/社区版本分析 MySQL5.5:默认存储引擎改为InnoDB,提高性能和可扩展性,增加半同步复制 MySQL5.6 ...
- cenos 防火墙操作
iptables防火墙 1.基本操作 # 查看防火墙状态 service iptables status # 停止防火墙 service iptables stop # 启动防火墙 servi ...
- Jmeter对Websocket进行接口压力测试
压力测试是给软件不断加压,强制其在极限的情况下运行,观察它可以运行到何种程度,从而发现性能缺陷,是通过搭建与实际环境相似的测试环境,通过测试程序在同一时间内或某一段时间内,向系统发送预期数量的交易请求 ...