RaptureXML 1.0.1.1

RaptureXML 1.0.1.1

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年5月

John Blanco-description=Mac 维护。



RaptureXML 1.0.1.1

  • John Blanco 和 Francis Chong

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

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

入门

RaptureXML 以两步处理 XML:加载和路径。这意味着您首先从任何源加载 XML,例如文件、数据、字符串或甚至从 URL。然后,您可以使用其查询语言找到您需要的内容。

您可以使用以下任何构造函数加载 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 elementFromURL:[NSURL URLWithString:@"...my url..."]];
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是由Rapture In Venice的John Blanco创建的,因为他厌倦了使用所有这些奇特的XML解决方案来进行iPhone开发。如果您喜欢这段代码或需要iOS顾问,请通过我的网站联系我,Rapture In Venice