xml 包
介绍
提供基于标准的 XML 文本处理,暂不支持外部实体功能,以及 ?> 形式的指令声明
主要接口
interface SaxHandler
public interface SaxHandler {
func startDocument(): Unit
func endDocument(): Unit
func startElement(name: String, attrs: ArrayList<XmlAttr>): Unit
func endElement(name: String): Unit
func characters(content: String): Unit
}
提供 SAX 模式的回调函数接口。
func startDocument
func startDocument(): Unit
功能:开始解析 XML 文本时执行的回调函数。
func endDocument
func endDocument(): Unit
功能:结束解析 XML 文本时执行的回调函数。
func startElement
func startElement(name: String, attrs: ArrayList<XmlAttr>): Unit
功能:开始解析 XML 元素时执行的回调函数。
参数:
- name:元素名称
- attrs:元素属性列表
func endElement
func endElement(name: String): Unit
功能:结束解析 XML 元素时执行的回调函数。
参数:
- name:元素名称
func characters
func characters(content: String): Unit
功能:解析得到 XML 字符数据时执行的回调函数。
参数:
- content:元素文本内容
class XmlParser
public class XmlParser {
public init()
public init(handler: SaxHandler)
}
此类提供 XML 解析功能,目前支持两种模式:文档对象模型(DOM)模式和 XML 简单 API(SAX)模式,暂不支持外部实体功能,以及 ?> 形式的指令声明。
支持 5 个内置符号的解析,如下表所示:
| 符号 | 字符 |
| --- | --- |
| <
| <
, <
, <
|
| >
| >
, >
, >
|
| &
| &
, &
, &
|
| '
| '
, '
, '
|
| "
| "
, "
, "
|
init
public init()
功能:创建 XML 文档对象模型(DOM)模式解析器。
异常:
- XmlException:如果初始化失败,抛出异常
init
public init(handler: SaxHandler)
功能:创建 XML 简单 API(SAX)模式解析器。
参数:
- handler:实现了 SaxHandler 的一组回调函数
异常:
- XmlException:初始化失败
func parse
public func parse(str: String): Option<XmlElement>
功能:解析字符串类型的 XML 文本。
参数:
- str:XML 文本,最大解析长度 2^32 - 1, 即 UInt32 的最大值
返回值:DOM模式下解析成功则返回 Option
异常:
- XmlException:内存分配失败,或解析文本出错,或存在空指针
- IllegalArgumentException:XML 文本中包含字符串结束符
class XmlAttr
public class XmlAttr <: ToString {
public init(name: String, content: String)
}
此类存储 XML 元素节点属性,并提供查询其内容的函数。
如需使用 XmlAttr 构造 XML 文档,请注意符合 XML 规范,具体规范请查阅 W3C 官网。
部分接口提供了有限的检查功能,例如节点名称为空,首字母为 '-' 、 '.' 、 '[0-9]' 等。
init
public init(name: String, content: String)
功能:创建新的 XmlAttr 对象。
参数:
- name:属性名称
- content:属性值
异常:
- XmlException:属性名称为空,或首字母为 '-' 、 '.' 、 '[0-9]'
prop name
public mut prop name: String
功能:获取或设置属性名称
异常:
- XmlException:设置属性名称为空,或首字母为 '-' 、 '.' 、 '[0-9]'
prop content
public mut prop content: String
功能:获取或设置属性值
func toString
public func toString(): String
功能:将 XmlAttr 转换成字符串。
返回值:当前 XmlAttr 实例的字符串值
class XmlElement
public class XmlElement <: ToString {
public init(name: String, content: String)
}
此类存储 XML 元素节点,并提供查询其内容的函数。
如需使用 XmlELement 构造 XML 文档,请注意符合 XML 规范,具体规范请查阅 W3C 官网。
部分接口提供了有限的检查功能,例如节点名称为空,首字母为 '-' 、 '.' 、 '[0-9]',属性名称必须保证唯一等。
init
public init(name: String, content: String)
功能:创建新的 XmlElement 对象。
参数:
- name:节点名称
- content:节点文本内容
异常:
- XmlException:节点名称为空,或首字母为 '-' 、 '.' 、 '[0-9]'
prop name
public mut prop name: String
功能:获取或设置节点名称
异常:
- XmlException:设置节点名称为空,或首字母为 '-' 、 '.' 、 '[0-9]'
prop content
public mut prop content: String
功能:获取或设置节点文本内容
prop isClosed
public prop isClosed: Bool
功能:判断节点是否闭合
prop childrenNum
public prop childrenNum: Int64
功能:获取节点的子节点个数
prop childrenElements
public mut prop childrenElements: ArrayList<XmlElement>
功能:获取或设置节点所有子节点
prop attributesNum
public prop attributesNum: Int64
功能:获取节点属性个数
prop attributes
public mut prop attributes: ArrayList<XmlAttr>
功能:获取节点的属性,返回节点属性的深拷贝,设置节点的属性。
异常:
- XmlException:设置节点属性时,如果传入的属性列表中有重复字段,抛出异常
func toString
public func toString(): String
功能:返回 XML 字符串,该字符串会在一行显示,其中的实体引用将会被解析,例如: '<
' 将替换成 '<'。
返回值:解析得到的字符串
func toXmlString
public func toXmlString(): String
功能:返回格式化后的 XML 字符串,该字符串会以 XML 的格式体现,其中的实体引用将会被解析,例如: '<
' 将替换成 '<'。
返回值:解析并且格式化后的字符串
class XmlException
public class XmlException <: Exception {
public init()
public init(message: String)
}
XML 异常类。
init
public init()
功能:创建 XmlException 实例。
init
public init(message: String)
功能:创建 XmlException 实例,可指定异常信息。
参数:
- message:异常提示字符串
示例
Xml DOM 模式使用
下面是 XML 解析的示例。
代码如下:
from encoding import xml.*
main() {
let x: XmlParser = XmlParser()
var ret = x.parse("<myxml>Some data </myxml>")
match (ret) {
case Some(root) => println(root.name)
case None => println("XML Parse error.")
}
return 0
}
运行结果如下:
myxml
Xml SAX 解析模式使用
下面是 XML SAX 解析模式使用的示例。
代码如下:
from std import collection.*
from encoding import xml.*
let latestMovie = """
<collection shelf="New Arrivals">
<movie title="Movie 2021">
<score>7.4</score>
<year>2021-3</year>
<description>This is a virtual film released in 2021 for testing.</description>
</movie>
<movie title="Movie 2022">
<type>Anime, Science Fiction</type>
<score>7</score>
<year>2022-2</year>
<description>This is a virtual film released in 2022 for testing.</description>
</movie>
<movie title="Movie 2023">
<score>6.5</score>
<year>2023-4</year>
<description>This is a virtual film released in 2023 for testing.</description>
</movie>
</collection>
"""
class MovieHandler <: SaxHandler {
private var curTag: String
private var title: String
private var score: String
private var year: String
init() {
curTag = ""
title = ""
score = ""
year = ""
}
public func startDocument(): Unit {
println("Start Parsing.")
}
public func endDocument(): Unit {
println("End Parsing.")
}
public func startElement(name: String, attrs: ArrayList<XmlAttr>): Unit {
curTag = name
if (name == "movie") {
title = attrs[0].content
println("Title: ${title}")
}
}
public func endElement(name: String): Unit {
if (curTag == "score") {
println("Score: ${score}")
} else if (curTag == "year") {
println("Year: ${year}")
}
}
public func characters(content: String): Unit {
if (curTag == "score") {
score = content
} else if (curTag == "year") {
year = content
}
}
}
main() {
var handler = MovieHandler()
let x: XmlParser = XmlParser(handler)
x.parse(latestMovie)
return 0
}
运行结果如下:
Start Parsing.
Title: Movie 2021
Score: 7.4
Year: 2021-3
Title: Movie 2022
Score: 7
Year: 2022-2
Title: Movie 2023
Score: 6.5
Year: 2024-4
End Parsing.