正则要在标签中获得价值
-
20-09-2019 - |
题
我有一组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语法的快速概述。
其他提示
在不知道您的语言或环境的情况下,这里有一些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.
不隶属于 StackOverflow