2013-03-11 30 views
1

嗨,我有一个XMl响应字符串,其中包含大量无用的元素,但正如我们所知,NSXMLParser的设计方式是它访问每个元素,这个过程实际上正在破坏我的速度。有什么方法可以跳过一些元素。以下是我的XML字符串,我想跳过xs:schema元素。在解析时跳过XML的一些内容

<DataSet xmlns="http://www.sample.com/researchportal/"> 
<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet"> 
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
<xs:complexType> 
<xs:choice minOccurs="0" maxOccurs="unbounded"> 
<xs:element name="Table1"> 
<xs:complexType> 
<xs:sequence> 
<xs:element name="state" type="xs:string" minOccurs="0"/> 
<xs:element name="userid" type="xs:string" minOccurs="0"/> 
<xs:element name="message" type="xs:string" minOccurs="0"/> 
</xs:sequence> 
</xs:complexType> 
</xs:element> 
</xs:choice> 
</xs:complexType> 
</xs:element> 
</xs:schema> 
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
<NewDataSet xmlns=""> 
<Table1 diffgr:id="Table11" msdata:rowOrder="0" diffgr:hasChanges="inserted"> 
<state>True</state> 
<userid>16</userid> 
<message/> 
</Table1> 
</NewDataSet> 
</diffgr:diffgram> 
</DataSet> 
+0

表明我们的代码....你可以跳过该关键字。 – 2013-03-11 12:07:21

+0

感谢您的快速响应我想在一次检查中跳过整个xs:schema块,我不想检查xs内的每个元素:模式 – 2013-03-11 12:09:54

+0

添加您用于解析的代码。 – 2013-03-11 12:10:58

回答

1

我已经找到了一个办法可能是它不是最好的,但有些我如何得到一个快速的解析。

NSData * fileData = [[NSData alloc] initWithContentsOfURL:url]; 
xmlParser = [[NSXMLParser alloc] initWithData:[self removeElements:fileData]]; 
[xmlParser setDelegate:objUtil]; 
success = [xmlParser parse]; 

我ahve ceated的方法removeElements:fileData,它接受的NSData并返回相同的,与所需的结果(通过修剪XML字符串)。

- (NSData*) removeElements :(NSData*)data 
{ 
NSMutableString * strFromData = [[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
NSRange startRange = [strFromData rangeOfString:@"<xs:schema"]; 
NSRange endRange = [strFromData rangeOfString:@"<diffgr"]; 
[strFromData replaceCharactersInRange: NSMakeRange(startRange.location,endRange.location - startRange.location) withString: @""]; 
NSLog(@"%@",strFromData); 
NSData *retData = [strFromData dataUsingEncoding:NSUTF8StringEncoding]; 
return retData; 
} 

感谢所有谁拿出时间他们忙碌工作的朋友帮我:)

0

它可能不是你正在寻找最佳的解决方案,但是但是我要去写它,如果它可以帮助你

你可以声明字符串常量像

static NSString *kItem1 = @"ItemToMatch"; 

在didStart和didEnd功能的比较可以用常数来完成,如:

if ([elementName isEqualToString:kItem1]) {} 

它瓦特生病减少分析过程中创建的对象的数量,希望这有助于!

+0

感谢您的回答,但它仍然在做比较,并会做所有的元素,因此相同的情况.. – 2013-03-11 12:27:37

+0

是的,我知道我仍在寻找这个,但我给的答案只是为了比较快我认为可能会显着增强性能 – channi 2013-03-11 12:29:28

+0

尝试使用[self parser:(NSXMLParser *)self didEndElement:elementName namespaceURI:namespaceURI qualifiedName:qName];当你在解析时遇到@“xs:schema” – channi 2013-03-11 12:38:13

0

尝试使用TBXML为iOS解析库。这是一个易于使用的DOM解析器。

你可以找到解析器比较这里:Ray Wenderlich Blog

+0

它会解决这里提到的问题..不给无关紧要的答案。 – 2013-03-11 12:51:23

+0

@ vishwa.deepak:我认为你的评论很粗鲁。首先你问问题寻求解决你的问题,而不是检查他的建议是否让他失望。 – 2013-03-11 13:34:16

+0

@ rohan-patel:它不是粗鲁无礼。给出无关紧要的答案只是禁止获得必要解决方案的机会,人们在他们看到答案的时候监督这个问题,并且一直没有回答。阿拉克不是我的敌人。 :) – 2013-03-12 10:03:18