RaptureXML@siuying 1.0.1.1

RaptureXML@siuying 1.0.1.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2014年12月

匿名 维护。



  • John Blanco 和 Francis Chong

RaptureXML 是一个简单的、基于块(block)的 XML 库,适用于 iOS 平台,它提供了一个强有力的 API,让你的 XML 处理变得有趣。

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

您来告诉我。在 Objective-C 中处理 XML 是一场可怕的、挫败的经历,生成的代码也永远不会易读。我已经厌倦了!RaptureXML 通过在 libxml2 之上提供一个新的强大接口来解决这一问题。想象一下,您将如何使用您最喜欢的 XML 处理库编写处理球队成员列表 XML 的代码,检索他们的号码、名字和位置。现在,看看您如何使用 RaptureXML 来实现

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/RaptureXML 文件夹复制到您的项目中,并在某个地方(例如,PCH 文件)导入 "RXMLElement.h"。
  • 将 libz.dylib 链接到您的目标上。
  • 将 libxml2.dylib 链接到您的目标上。
  • 在您的构建设置中,对于“Header Search Paths”键,添加 "$(SDK_DIR)"/usr/include/libxml2

RaptureXML 支持 ARC。实际上,它无需分支即可做到这一点。代码会自动检测您的项目中是否使用了 ARC,并相应地进行编译。您还可以自由使用任何版本的 LLVM 或 gcc!(尽管您现在应该使用 LLVM。)

入门教程

RaptureXML 通过两个步骤处理 XML:加载和路径。这意味着您首先从任何您想加载 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"

我们可以通过以下方式获取 players 标签:

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 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由John Blanco在Rapture In Venice创建,因为他厌倦了使用iPhone开发中的所有奇怪XML解决方案。如果你喜欢这段代码或者需要iOS顾问,请通过我的网站联系我,[Rapture In Venice](http://raptureinvenice.com)。