2013-03-11 25 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