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

NSDataを受け入れて同じものを返すメソッドremoveElements:fileDataを停止し、必要な結果を取得しました(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パーサーです。

ここでパーサーの比較を見つけることができます:RayWenderlichブログ

于 2013-03-11T12:33:46.117 に答える