RaptureXML@Frankly 1.0.4

RaptureXML@Frankly 1.0.4

测试已测试
语言语言 Obj-CObjective C
许可 MIT
发布最后发布2016年8月

Justin Hill 维护。



  • Justin Hill

RaptureXML 是一个简单的基于块的 iOS 平台 XML 库,它提供了一个易于表达的 API,使 XML 处理变得有趣。

为什么我们需要另一个 XML 库?

您告诉我。在 Objective-C 中处理 XML 是一种糟糕、令人沮丧的经历,产生的代码也难以读取。我只厌倦了它!RaptureXML 通过在 libxml2 上提供一个新的强大界面来解决这一问题。

RXMLElement *rootXML = [RXMLElement elementFromXMLFile:@"players.xml"];

[rootXML iterate:@"players.player" usingBlock: ^(RXMLElement *e) {
    NSLog(@"Player #%@: %@", [e attribute:@"number"], [e child:@"name"].text);
}];    

RaptureXML 在 Objective-C 中的 XML 处理方面彻底改变了游戏规则。正如您所看到的代码,理解这段代码的含义只需几秒钟。没有浪费的数组和冗长的循环等问题。代码易于阅读和维护。

我想没有必要再说更多了。

将 RaptureXML 添加到您的项目中

将 RaptureXML 添加到您项目的推荐方法是通过 CocoaPods。只需将 'RaptureXML' 添加到您的 Podfile 中。

要手动安装,只需以下几个简单步骤

  • 将 RaptureXML/RaptureXML 文件夹复制到您的项目中,并在某处导入 "RXMLElement.h",例如,您的 PCH 文件。
  • 将 libz.dylib 链接到您的目标。
  • 将 libxml2.dylib 链接到您的目标。
  • 在您的构建设置中,对于 "Header Search Paths" 键,添加 "$(SDK_DIR)"/usr/include/libxml2

RaptureXML 支持 ARC。您可以使用任何版本的 LLVM 或 gcc,尽管您现在应该使用 LLVM。

ARC 不只是支持,是必需的!

RaptureXML 支持 ARC。实际上,它只支持 ARC。如果您仍在运行一个不使用 ARC 的项目,RaptureXML 可能不会是您的菜。

入门指南

RaptureXML 用两个步骤处理 XML:加载和路径。这意味着您首先从您想要的任何来源(如文件、数据或字符串)加载 XML。然后,您只需使用它的查询语言来找到您需要的内容。

您可以使用以下任何构造函数加载 XML

RXMLElement *rootXML = [RXMLElement elementFromXMLString:@"...my xml..." encoding:NSUTF8StringEncoding];
RXMLElement *rootXML = [RXMLElement elementFromXMLFile:@"myfile.xml"];
RXMLElement *rootXML = [RXMLElement elementFromXMLFilename:@"myfile" elementFromXMLFilename:@"xml"];
RXMLElement *rootXML = [RXMLElement elementFromXMLData:myData];

这些构造函数返回一个RXMLElement对象,表示顶级标签。现在,您可以以任何数量查询数据。

让我们假设您的XML看起来像这样

<team year="2011" name="New York Mets">
    <players>
        <coach>
            <name>Terry Collins</name>
            <year>1</year>
        </coach>

        <player number="7">
            <name>Jose Reyes</name>
            <position>SS</position>
        </player>

        <player number="16">
            <name>Angel Pagan</name>
            <position>CF</position>
        </player>

        <player number="5">
            <name>David Wright</name>
            <position>3B</position>
        </player>

        ...

    </players>
</team>

首先,我们会加载XML

RXMLElement *rootXML = [RXMLElement elementFromXMLFile:@"players.xml"];

我们可以立即查询顶级标签名称

rootXML.tag --> @"team"

我们可以通过以下方式读取属性

[rootXML attribute:@"year"] --> @"2011"
[rootXML attribute:@"name"] --> @"New York Mets"

我们可以通过以下方式获取玩家标签

RXMLElement *rxmlPlayers = [rootXML child:@"players"];

如果我们愿意,我们可以通过以下方式获取所有单个玩家标签

NSArray *rxmlIndividualPlayers = [rxmlPlayers children:@"player"];

从那里,我们可以处理单个玩家并感到高兴。现在,这已经比我们见过的任何其他XML库都要好得多,但RaptureXML可以使用查询路径来使这一切变得易如反掌。让我们使用查询路径来提高我们代码的简洁性

[rootXML iterate:@"players.player" usingBlock: ^(RXMLElement *player) {
    NSLog(@"Player: %@ (#%@)", [player child:@"name"].text, [player attribute:@"number"]);
}];    

您的块在只一行中传递一个表示每个玩家的RXMLElement!或者,您也可以这样缩短它

[rootXML iterate:@"players.player" usingBlock: ^(RXMLElement *player) {
    NSLog(@"Player: %@ (#%@)", [player child:@"name"], [player attribute:@"number"]);
}];    

这也同样工作,因为RXMLElement#description返回标签的文本。查询路径在有通配符的情况下更加强大。假设我们想要得到球队中每个人的名字,球员或教练。我们使用通配符来获取它

[rootXML iterate:@"players.*.name" usingBlock: ^(RXMLElement *name) {
    NSLog(@"Name: %@", name.text);
}];

通配符会处理所有的标签,而不是您可能会命名的那个。您也可以使用通配符遍历元素的子元素

[rootXML iterate:@"players.coach.*" usingBlock: ^(RXMLElement *e) {
    NSLog(@"Tag: %@, Text: %@", e.tag, e.text);
}];

这给出了教练的所有标签。简单吗?

XPath

如果您不想使用自定义RaptureXML迭代查询语法,您也可以使用标准的XPath查询语言。以下是如何使用XPath查询所有球员的方法

[rootXML iterateWithRootXPath:@"//player" usingBlock: ^(RXMLElement *player) {
    NSLog(@"Player: %@ (#%@)", [player child:@"name"], [player attribute:@"number"]);
}];    

记住,您也可以使用XPath测试属性。以下是查找编号为#5的球员的方法

[rootXML iterateWithRootXPath:@"//player[@number='5']" usingBlock: ^(RXMLElement *player) {
    NSLog(@"Player #5: %@", [player child:@"name"]);
}];    

请注意,您只能从文档根中使用XPath,并且它不会钱的RXMLElement有什么不同。如果您有派生RXMLElement,您仍然可以从文档根构建。如果您不熟悉XPath,可以使用这个实用的指南

命名空间

大多数方法支持命名空间,但不支持迭代。如果您想用那种方法使用命名空间,请手动使用children方法。在指定命名空间时,确保指定命名空间URI,而不是前缀。例如,如果您的XML看起来像

<team xmlns:sport="*" sport:year="2011" sport:name="New York Mets">
    ...
</team>

您会使用以下方式访问属性

NSLog(@"Team Name: %@", [e attribute:@"name" inNamespace:@"*"]);

RubyMotion支持

RaptureXML可以轻松集成到RubyMotion中!这里有方法

单元测试作为文档

您可以通过阅读项目中的单元测试来查看RaptureXML的完整用法。这不仅显示了所有代码,而且还知道它是可以工作的!(您可以通过在XCode中按下Command-U来运行单元测试)

谁创建了RaptureXML?

RaptureXML是由Rapture In Venice的John Blanco创建的,因为他对使用所有奇特的iPhone开发解决方案感到厌烦。如果您喜欢这段代码并且/或者需要iOS顾问,请通过我的网站Rapture In Venice与我联系。