我有一组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> 但不是标签本身,并且仅对第一个实例(或基于其他测试选择)具有该标签。

这是有可能的吗?

有帮助吗?

解决方案

这种任务的最佳工具是 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语法的快速概述。

其他提示

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

你应该使用 XML解析器, 不发条. XML不是常规语言, 因此不容易解析 经过 正则表达式. 不要做.

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

您可以使用 外籍, ,有 目标C结合.

苹果的选择是:

  1. CF XML解析器
  2. 基于树的可可解析器(仅10.4)

在不知道您的语言或环境的情况下,这里有一些Perl表达式。希望它能为您的申请提供正确的想法。

您的正则表达式捕获标签的文本内容将看起来像这样:

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

这将捕获每个标签中的内容。您将必须循环播放以提取所有内容。请注意,这不会说明自终止的标签。您将需要一个带有负面外观的正则发动机来实现这一目标。在不知道您的环境的情况下,很难说是否会得到支持。

您也可以使用以下内容从源来剥离所有标签:

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

同样,根据您的环境,如果您可以使用XML放置库,则可以使您的生活更加轻松。毕竟,通过采用正则方法,您将失去XML真正为您提供的一切(结构化数据,上下文意识等)。

正如其他人所说,您真的应该使用 NSXMLParser 对于这种事情。

但是,如果你 只要 需要在名称标签中提取内容,然后 Regexkitlite 可以很容易地做到这一点:

NSString * xmlString = ...;
NSArray * captures = [xmlString arrayOfCaptureComponentsMatchedByRegex:@"<name>(.*?)</name>"];
for (NSArray * captureGroup in captures) {
  NSLog(@"Name: %@", [captureGroup objectAtIndex:1];
}

小心名称空间:

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

是等效的XML,它将破坏基于Regexp的代码。对于XML,请使用XML解析器。 XPATH是您的朋友。下面的XPATH代码将返回一系列字符串,其中包含您想要的信息:

./rsp/site/name/text()

可可拥有 NSXML支持XPath.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top