【问题标题】:Getting the value of an Element in Cocoa using TouchXML使用 TouchXML 获取 Cocoa 中元素的值
【发布时间】:2010-10-06 07:52:12
【问题描述】:

由于 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 中有它。

【问题讨论】:

    标签: cocoa-touch touchxml


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复,我遇到了以下异常消息:[CXMLElement isEqualToString:]: unrecognized selector sent to instance
    • 我敢打赌,这一切都与我尝试使用的 Web 服务是基于 .NET 的事实有关,但不幸的是我无法控制,我搜索了一下,似乎xmlns 属性是所有问题的原因。
    • 我不在任何项目中使用 TouchXML,尽管我使用 libxml2(这是 TouchXML 的包装器),所以底层库确实有效。如果这不是经过良好测试的代码路径,我不会感到震惊,您可能需要在 TouchXML 中修复某些内容。
    • 谢谢。正是我的问题,这解决了它。
    • 谢谢。我尝试使用它,但我不确定 NSDictionary 的密钥是做什么用的,所以我只输入了任何内容。尽管“/foo/bar”,但我一直使用相同的 XPath,所以它失败了。然后我意识到我必须在我的 XPath 中使用你演示的密钥(一开始我没有注意到它),所以我使用了“/ns:foo/ns:bar”,其中 ns 是我使用的密钥,它工作正常。希望这会有所帮助。
    【解决方案2】:

    我遇到了类似的问题。对指定了命名空间 (xmlns="http://somenamespace") 的 XML 进行任何选择都将导致找不到节点。考虑到它确实支持额外的命名空间格式,例如 xmlns:somenamespace="http://somenamespace",这很奇怪。

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

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

    【讨论】:

      【解决方案3】:

      试试

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

      【讨论】:

      • 正如上面的答案所说,您需要namespaceMapping
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 2018-04-19
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多