行计数使用 RaptureXML 返回不正确的数字

Posted

技术标签:

【中文标题】行计数使用 RaptureXML 返回不正确的数字【英文标题】:Row Count Is Returning the incorrect number using RaptureXML 【发布时间】:2012-04-30 00:23:54 【问题描述】:

我目前正在使用 RaptureXML 从表格视图中的 url tio 显示中提取数据。我已经设法抓取了我需要的每个字符串并将其添加到我的数组中,如下所示:

- (void)loadURL 

RXMLElement *rootXML = [RXMLElement elementFromURL:[NSURL URLWithString:@"http://api.somexml.com/xml"]];

NSLog(@"%@ %@", rootXML.tag, [rootXML attribute:@"totalEntries"]); 
[rootXML iterateWithRootXPath:@"//event" usingBlock:^(RXMLElement *event) 
    // NSLog(@"Event - URI: %@", [event attribute:@"uri"]);
    // NSLog(@"Event - Venue: %@", [event attribute:@"displayName"]);
    // NSLog(@"Event - Type: %@", [event attribute:@"type"]);

    [rootXML iterateWithRootXPath:@"//location" usingBlock: ^(RXMLElement *location) 
        // NSLog(@"Location - City: %@",[location attribute:@"city"]);
        // NSLog(@"Location - Latitude : %@",[location attribute:@"lat"]);
        // NSLog(@"Location - Longitude: %@",[location attribute:@"lng"]);

        [rootXML iterateWithRootXPath:@"//start" usingBlock:^(RXMLElement *start) 
            // NSLog(@"Start - Time: %@",[start attribute:@"time"]);
            // NSLog(@"Start - Date: %@",[start attribute:@"date"]);

            [rootXML iterateWithRootXPath:@"//performance" usingBlock:^(RXMLElement *performance) 
                // NSLog(@"Performance - Artist: %@",[start attribute:@"displayName"]);

                [events addObject:[NSArray arrayWithObjects:
                                   [event attribute:@"uri"],
                                   [event attribute:@"displayName"],
                                   [event attribute:@"type"],
                                   [location attribute:@"city"],
                                   [location attribute:@"lat"],
                                   [location attribute:@"lng"],
                                   [start attribute:@"time"],
                                   [start attribute:@"date"],
                                   [performance attribute:@"displayName"],
                                   nil]];                
            ];

        ];


    ];



];


问题是当我分配行数时,它返回的是一个大数字而不是 6。

 return [events count];

这是 XML 文件的样子:

<resultsPage totalEntries="6" perPage="50" page="1" status="ok">
<results>
<event uri="http://somexml.com/xml" popularity="0.863682" displayName="Radio 1's Hackney 
Weekend 2012" id="9234656" type="Festival" status="ok">
<location city="London, UK" lng="-0.128" lat="51.5078"/>
<series displayName="Radio 1's Hackney Weekend"/>
<end time="" date="2012-06-24" datetime=""/>
<start time="" date="2012-06-23" datetime=""/>
<performance displayName="Lucy Labeaux" billingIndex="5" id="23336188" billing="headline">
<artist uri="http://www.somexml.com/artistxml" displayName="Lucy Labeaux" id="1168415">
<identifier href="http://somexml.com.xml" mbid="4593d49a-7f67-46ba-9ec0-126bd676286f"/>
</artist>
</performance>

感谢您的帮助!

**

获取与我的数组对象相关的错误。

**

所以我从不断运行代码中发现了一些东西。如果您看下面,我将对象添加到我的数组中 3 次。

- (void)loadURL 

RXMLElement *rootXML = [RXMLElement elementFromURL:[NSURL URLWithString:@"http://somexml.com/xml"]];

NSLog(@"%@ %@", rootXML.tag, [rootXML attribute:@"totalEntries"]);

[rootXML iterateWithRootXPath:@"//event" usingBlock:^(RXMLElement *event) 

    [events addObject:[NSArray arrayWithObjects:
                       [event attribute:@"uri"],
                       [event attribute:@"displayName"],
                       [event attribute:@"type"], nil]];
 ];

[rootXML iterateWithRootXPath:@"//location" usingBlock: ^(RXMLElement *location) 

    [events addObject:[NSArray arrayWithObjects:
                       [location attribute:@"city"],
                       [location attribute:@"lat"],
                       [location attribute:@"lng"],
                       nil]]; 
];    

[rootXML iterateWithRootXPath:@"//start" usingBlock:^(RXMLElement *start) 

    [events addObject:[NSArray arrayWithObjects:
                       [start attribute:@"time"],
                       [start attribute:@"date"],
                       nil]]; 
];


现在,当我调用我的对象以便将它们链接到界面时,我执行了以下操作:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

EventsCell *cell = (EventsCell *)[tableView dequeueReusableCellWithIdentifier:@"EventsCell"];

cell.venueLabel.text = [NSString stringWithFormat:@"%@",[[events objectAtIndex:indexPath.row] objectAtIndex:2]];

return cell;

我意识到,不是在索引处创建总共 8 个对象,而是只创建 3 个。每次添加新对象时,它都会将其添加到这 3 个索引中。例如,如果我将 Venue Label 分配给 objectAtIndex 2,我不仅会得到 6 行带有显示类型的标签,而且还会得到另外 6 行显示时间。

这就是我的 viewDidLoad 的样子:

- (void)viewDidLoad

[super viewDidLoad];

self.events = [[NSMutableArray alloc] init];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
    [self loadURL];

    dispatch_async(dispatch_get_main_queue(), ^
        [self.tableView reloadData];
    );
);


【问题讨论】:

你为什么要在更多的迭代中迭代?看起来您想进一步深入研究 xml,对吗?如果是这样,那么编辑您的 xpath,并将所有这些语句带出这些循环。永远不要在 inside 另一个循环中使用iterateWithRootXPath:。你会得到比你想要被复制更多的东西。这可能就是您之前的解析如此缓慢的原因。 这正是我可能会不断重复的原因。现在我的问题是,当我在任何循环之外迭代每个语句时,我无法将所有对象一起添加到我的数组中。我必须这样做: 这就是我想要做的,但是我不能同时添加所有的对象,因此当我调用它们在界面中显示时,除了第一个对象之外我什么也没有添加。 [链接]desmond.yfrog.com/Himg855/… 看来你添加它们是正确的。您似乎也在使用 ivar 来存储数组,对吗?如果是这样,您需要使用保留属性(或强,如果使用 ARC)来保留对创建的数组的保留引用。 我正在使用 ARC 并且我一直在使用强属性 '@property (nonatomic, strong) NSMutableArray * events;'但是当我为接口调用一个对象时,如果我索引任何高于 2 的对象,我会收到错误消息。难道每次我添加对象时它都会替换旧的对象吗? 【参考方案1】:

看到没有人将问题作为“答案”回答,而是将答案留在了 cmets 中,我将接受这个作为答案。

【讨论】:

以上是关于行计数使用 RaptureXML 返回不正确的数字的主要内容,如果未能解决你的问题,请参考以下文章

PHP number_format 返回不正确的数字

jdbc的executeBatch()返回正确的行计数

为啥在使用“.count”返回 Swift 下标计数时收到不正确的数组计数?

PHP中科学计数法中的数字不正确

为啥 SQL 计数(*)与 SQL 计数(数字)存在行为差异

命令行程序的返回值