1

嗨,我有一个 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>
4

3 回答 3

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;
}

感谢所有在忙碌的工作中抽出时间帮助我的朋友:)

于 2013-03-12T10:19:15.673 回答
0

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

您可以将字符串声明为常量,例如

static NSString *kItem1 = @"ItemToMatch";

在 didStart 和 didEnd 函数中,可以使用常量进行比较,例如:

if ([elementName isEqualToString:kItem1]) {}

它将减少解析过程中创建的对象数量,希望对您有所帮助!!

于 2013-03-11T12:21:00.260 回答
0

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

您可以在此处找到解析器比较:Ray Wenderlich 博客

于 2013-03-11T12:33:46.117 回答