CheatyXML 3.1.1

CheatyXML 3.1.1

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最后发布2021 年 1 月
SPM支持 SPM

Louis BODART 维护。



CheatyXML 3.1.1

CheatyXML

CocoaPods Build Status codecov

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生成器