0

我有一组返回的 XML 样本:

<rsp stat="ok">
  <site>
    <id>1234</id>
    <name>testAddress</name>
    <hostname>anotherName</hostname>
    ...

  </site>
  <site>
    <id>56789</id>
    <name>ba</name>
    <hostname>alphatest</hostname>
    ...
  </site>
</rsp>

我想提取<name></name>其中的所有内容,但不提取标签本身,并且仅在第一个实例中提取(或基于其他一些测试选择哪个项目)。

这可以用正则表达式吗?

4

5 回答 5

3

<disclaimer>我不使用 Objective-C</disclaimer>

您应该使用XML 解析器而不是正则表达式XML 不是一种常规语言,因此不容易被正则表达式解析不要这样做

切勿使用正则表达式或基本字符串解析来处理 XML。现在常用的每种语言都具有非常好的 XML 支持。XML 是一个看似复杂的标准,您的代码不太可能是正确的,因为它可以正确解析所有格式正确的 XML 输入,即使这样,您也是在浪费时间,因为(如前所述)每种语言常见用法有 XML 支持。使用正则表达式解析 XML 是不专业的。

您可以使用Expat,并带有Objective C bindings

苹果的选择是

  1. CF xml 解析器
  2. 基于树的 Cocoa 解析器(仅限 10.4)
于 2009-11-15T06:10:39.823 回答
2

在不了解您的语言或环境的情况下,这里有一些 perl 表达式。希望它能为您的应用程序提供正确的想法。

捕获标签文本内容的正则表达式如下所示:

m/>([^<]*)</

这将捕获每个标签中的内容。您必须循环匹配以提取所有内容。请注意,这不考虑自终止标签。您将需要一个带有负面后视的正则表达式引擎来实现这一点。在不了解您的环境的情况下,很难说它是否会受到支持。

您也可以使用以下方式从源中删除所有标签:

s/<[^>]*>//g

此外,根据您的环境,如果您可以使用 XML 解析库,它会让您的生活更轻松。毕竟,通过采用正则表达式方法,您将失去 XML 真正为您提供的一切(结构化数据、上下文感知等)。

于 2009-11-15T05:41:55.460 回答
1

完成此类任务的最佳工具是XPath

NSURL *rspURL = [NSURL fileURLWithPath:[@"~/rsp.xml" stringByExpandingTildeInPath]];
NSXMLDocument *document = [[[NSXMLDocument alloc] initWithContentsOfURL:rspURL options:NSXMLNodeOptionsNone error:NULL] autorelease];

NSArray *nodes = [document nodesForXPath:@"/rsp/site[1]/name" error:NULL];
NSString *name = [nodes count] > 0 ? [[nodes objectAtIndex:0] stringValue] : nil;

如果您想要 id 为 56789 的站点的名称,请改用此 XPath /rsp/site[id='56789']/name:。我建议您阅读W3Schools XPath 教程以快速了解 XPath 语法。

于 2009-12-23T17:04:28.910 回答
1

正如其他人所说,你真的应该使用NSXMLParser这种东西。

但是,如果您需要提取名称标签中的内容,那么RegexKitLite可以很容易地做到这一点:

NSString * xmlString = ...;
NSArray * captures = [xmlString arrayOfCaptureComponentsMatchedByRegex:@"<name>(.*?)</name>"];
for (NSArray * captureGroup in captures) {
  NSLog(@"Name: %@", [captureGroup objectAtIndex:1];
}
于 2009-11-15T06:26:24.607 回答
0

小心命名空间:

<prefix:name xmlns:prefix="">testAddress</prefix:name>

是等效的 XML,它将破坏基于正则表达式的代码。对于 XML,使用 XML 解析器。XPath 是此类事情的好帮手。下面的 XPath 代码将返回包含所需信息的字符串序列:

./rsp/site/name/text()

Cocoa 具有对 XPath 的 NSXML 支持

于 2009-11-15T06:54:21.973 回答