您好我有一个XMl响应字符串,其中包含许多无用的元素,但正如我们所知,NSXMLParser的设计方式是它访问每个元素,这个过程实际上是在扼杀我的速度。有什么方法可以跳过一些元素。下面是我的XML字符串,我想跳过 xs:schema 元素。
<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 :(得分:1)
我发现一种方式可能不是最好的方式,而是一些我如何快速解析。
NSData * fileData = [[NSData alloc] initWithContentsOfURL:url];
xmlParser = [[NSXMLParser alloc] initWithData:[self removeElements:fileData]];
[xmlParser setDelegate:objUtil];
success = [xmlParser parse];
我已经停止了一个方法removeElements:fileData
,它接受NSData并返回相同的方法,并带有所需的结果(bY修剪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;
}
感谢所有花时间忙着帮助我的朋友们:)
答案 1 :(得分:0)
它可能不是您正在寻找的最佳解决方案,但是如果它可以帮助您我会写它
您可以将字符串声明为常量,如
static NSString *kItem1 = @"ItemToMatch";
在didStart和didEnd函数中,可以使用常量进行比较,例如:
if ([elementName isEqualToString:kItem1]) {}
它会减少解析过程中创建的对象数量,希望这有助于!!
答案 2 :(得分:0)
尝试使用TBXML解析iOS库。这是一个易于使用的DOM解析器。
您可以在此处找到解析器比较:Ray Wenderlich Blog