Skip to main content
 首页 » 编程设计

cocoa-touch之使用 TouchXML 获取 Cocoa 中元素的值

2024年10月24日10小虾米

由于 NSXML 在实际 iPhone 上的给定限制,我正在使用 TouchXml。无论如何,我刚刚开始使用 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]; 

基本上节点评估为零
if ([nodes count] > 0 ) { 
    amount = [nodes objectAtIndex:1]; 
} 

更新 1:我已经放弃使用 XPath 进行解析,并将其替换为 NSURLRequest,所以现在我将整个 XML 放在一个字符串中,但是我对objective-C 的粗鲁介绍仍在继续......我刚刚意识到我对.NET BCL,其中 Regex 之类的东西很容易获得。

UPDATE2:我已经想出了如何将 RegexKitLite 用于正则表达式。

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

请您参考如下方法:

问题在于您的 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];