CheatyXML
CheatyXML 是一个 Swift 框架,用于轻松管理 XML。
要求
- iOS 8.0 或更高版本
- tvOS 9.0 或更高版本
安装
Cocoapods
如果您正在使用 cocoapods,只需将在您的 Podfile
文件中添加 pod 'CheatyXML'
。
手册
要安装此插件,只需将 .xcodeproj 文件添加到您的项目,并别忘了链接 .framework 文件。
无论您何时想在自己的代码中使用它,只需键入
import CheatyXML
使用方法
以下是所有示例的XML内容
<blog version="1.0" creator="lobodart">
<name>MyAwesomeBlog!</name>
<users>
<admin is_active="true">lobodart</admin>
<moderator is_active="false">slash705</moderator>
<moderator is_active="...">...</moderator>
...
</users>
<article>
<title>My first article</title>
<description>This is the first article</description>
<infos>
<date>2015-03-15 15:42:42</date>
<rate>42</rate>
</infos>
...
</article>
<article>
...
</article>
...
</blog>
创建解析器实例
使用URL
let parser: CXMLParser! = CXMLParser(contentsOfURL: ...) // URL
使用字符串
let parser: CXMLParser! = CXMLParser(string: ...) // String
使用数据
let parser: CXMLParser! = CXMLParser(data: ...) // Data
使用标签检索元素
假设我们想检索示例中的 name
属性
let blogName: String! = parser["name"].stringValue // Returns a String
let blogName: String? = parser["name"].string // Returns an optional String
您还可以使用 rootElement
来使您的代码更清晰
let element = parser.rootElement["name"] // is the same as the notation seen before
要访问更深层的元素,只需连续使用
let blogAdmin: String! = parser["users"]["admin"].stringValue
print(blogAdmin) // lobodart
处理多个元素
现在让我们来看看 article
元素。我们可以看到,我们的 blog
包含几篇文章。
通过索引获取元素
如果我们要获取第一篇文章的标题,可以这样操作
let firstArticleTitle: String! = parser["article", 0]["title"].stringValue
let firstArticleTitle: String! = parser["article"][0]["title"].stringValue
这两种表示方法效果相同。选择您最喜欢的一种。
遍历元素的孩子节点
要遍历一个元素的所有孩子节点,只需使用 for in
传统语法
for element in parser.rootElement {
print(element.tagName)
}
此代码将返回
name
users
article
article
...
现在,要遍历元素的特殊孩子节点,代码几乎相同
for element in parser.rootElement.elementsNamed("article") {
print(element.tagName)
}
这次,它将返回
article
article
...
当然,您可以将此方法应用于任何更深层级的元素(例如 users
)。
元素的孩子节点数量
如果您想要获取一个元素包含的孩子节点总数,可以使用此代码
// Suppose we have 3 moderators in our example
let numberOfElements: Int = parser["users"].numberOfChildElements
print(numberOfElements) // 4 (3 moderators + 1 admin)
请注意,此代码计算了包含在 users
中的所有孩子节点。现在假设我们只想获取管理员数量。有两种不同的语法。再次,选择您最喜欢的
let numberOfElements: Int = parser["users"]["moderator"].count
let numberOfElements: Int = parser["users"].elementsNamed("moderator").count
类型转换
CheatyXML 允许将标签/属性的值转换为一些常见的类型。您可以为转换获取可选或非可选值。
let firstArticleRate = parser["article", 0]["rate"]
firstArticleRate.int // Optional(42)
firstArticleRate.intValue // 42
firstArticleRate.float // Optional(42.0)
firstArticleRate.floatValue // 42.0
如果您不确定类型,请使用可选转换。如果尝试使用不合适的转换器转换值,您的应用程序会崩溃。
let firstArticleTitle = parser["article", 0]["title"]
firstArticleTitle.string // Optional("My first article")
firstArticleTitle.stringValue // "My first article"
firstArticleTitle.int // nil
firstArticleTitle.intValue // CRASH!
缺失的标签
到目前为止,我们总是检索现有的标签,但如果标签不存在会发生什么?让我们举个例子
let articleDate: String! = parser["article", 0]["infos"]["date"].stringValue
print(articleDate) // 2015-03-15 15:42:42
let articleDateFail: String! = parser["articles", 0]["infos"]["date"].string // I intentionally add an 's' to 'article'
print(articleDateFail) // nil
注意
如果您有任何疑问,请记住,使用 .string
比使用 .stringValue
更安全。在前面的例子中,在 articleDateFail
上使用 .stringValue
会导致您的应用程序崩溃。
属性
获取一个
let blogVersion = parser.rootElement.attribute("version")
let adminIsActive = parser["users"]["admin"].attribute("is_active")
您也可以在属性上使用类型转换
let blogVersion = parser.rootElement.attribute("version").floatValue // 1.0
let creator = parser.rootElement.attribute("creator").stringValue // "lobodart"
获取所有
let attributes = parser.rootElement.attributes // Will give you a [CXMLAttribute]
let dic = attributes.dictionary // Will give you a [String: String]
待办事项
- 增加更多的单元测试
- 类映射
- XML生成器