使用TouchXML在Cocoa中获取Element的值

时间:2009-02-09 01:34:16

标签: cocoa-touch touchxml

我正在使用TouchXml,因为NSXML在实际iPhone上存在限制。无论如何,我刚刚开始使用Objective-C,我来自C#背景,感觉就像学习一些新东西..但是......这是我的xml文件......

<?xml version="1.0" encoding="utf-8"?>
<FundInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/webservices">
  <FundsReleaseDate>2009-02-11T00:00:00</FundsReleaseDate>
  <FundValue>7800</FundValue>
  <FundShares>1000</FundShares>
</FundInfo>

我正试图获得7800,即FundValue。有人能指出我正确的方向,我使用的是TouchXml CXMLDocument,myParser的类型是CXMLDocument,我试过了

NSArray *nodes = [myParser nodesForXPath:@"//FundInfo" error:&err];

基本上节点评估为nil

if ([nodes count] > 0 ) {
    amount = [nodes objectAtIndex:1];
}

更新1:我已经放弃了使用XPath进行解析,并将其替换为NSURLRequest,所以现在我将整个XML放在一个字符串中,但我对Objective-C的粗略介绍仍在继续......我只是意识到我有多么糟糕成为.NET BCL,像Regex这样的东西很容易获得。

UPDATE2:我已经弄清楚如何使用RegexKitLite进行正则表达式。

所以现在的问题是,如何从FundValue内部获得“7800”,现在这是一个大字符串。我已经确认我在NSString中使用NSLog编写了它。

3 个答案:

答案 0 :(得分:25)

问题是你的XML有一个命名空间,这意味着你的XPath实际上并不匹配。遗憾的是,没有默认映射,XPath实际上并没有定义一种在内部处理它的好方法,因此您无法通过更改XPath来修复它。相反,您需要通知解释器您希望如何在XPath中映射它。

看起来TouchXML通过以下方式实现对此的支持:

- (NSArray *)nodesForXPath:(NSString *)xpath namespaceMappings:(NSDictionary *)inNamespaceMappings error:(NSError **)error;

所以你可以尝试类似的东西:

NSDictionary *mappings = [NSDictionary dictionaryWithObject:@"http://tempuri.org/webservices" forKey:@"tempuri"];
[myParser nodesForXPath:@"//tempuri:FundInfo" namespaceMappings:mappings error:&err];

答案 1 :(得分:0)

我有类似的问题。对指定了命名空间的XML(xmlns =“http:// somenamespace”)的任何选择都将导致找不到节点。非常奇怪,因为它确实支持其他命名空间格式,例如xmlns:somenamespace =“http:// somenamespace”。

在任何情况下,通过 far ,最简单的方法是执行字符串替换并将xmlns =“http://tempuri.org/webservices替换为空字符串。

总的来说,我喜欢touchxml,但我不相信这个bug仍然存在。

答案 2 :(得分:-1)

尝试

NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err];