在解析时删除一些XML内容

时间:2013-03-11 12:06:16

标签: iphone ios xml-parsing nsxmlparser

您好我有一个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>

3 个答案:

答案 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