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 个内置符号的解析,如下表所示: | 符号 | 字符 | | --- | --- | | < | &lt;, &#60;, &#x3c; | | > | &gt;, &#62;, &#x3e; | | & | &amp;, &#38;, &#x26; | | ' | &apos;, &#39;, &#x27; | | " | &quot;, &#34;, &#x22; |

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.Some(element),失败则返回 Option.None,SAX模式下返回 Option.None

异常:

  • 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 字符串,该字符串会在一行显示,其中的实体引用将会被解析,例如: '&lt;' 将替换成 '<'。

返回值:解析得到的字符串

func toXmlString

public func toXmlString(): String

功能:返回格式化后的 XML 字符串,该字符串会以 XML 的格式体现,其中的实体引用将会被解析,例如: '&lt;' 将替换成 '<'。

返回值:解析并且格式化后的字符串

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.