• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Is NSXMLParser really a streaming parser?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Is NSXMLParser really a streaming parser?


  • Subject: Re: Is NSXMLParser really a streaming parser?
  • From: Chris Parker <email@hidden>
  • Date: Thu, 1 Nov 2007 13:28:31 -0700

Hi Christopher,

I think you're misunderstanding the use of the word "streaming" in the API description. NSXMLParser is a "streaming" parser in the sense that it produces a stream of events w.r.t. the XML document rather than a fully-cooked document/DOM tree.

We have an enhancement request for NSXMLParser to accept an NSInputStream, which would do the kind of thing you're trying to do here. Unfortunately as of Leopard there is still no "take bytes in chunks and parse them" API on NSXMLParser.

BTW, your code below is re-initializing the same parser instance over and over again - you should only be sending any "-init*" method to an object instance once. The behavior you'd be getting here is completely undefined.

.chris

--
Chris Parker
Cocoa Frameworks
Apple Inc.

On Nov 1, 2007, at 11:29 AM, Christopher Woodruff wrote:

I am working on a project that requires parsing of XML data that comes from a socket stream. I want to feed an NSXMLParser object xml data from my socket connection 1 byte at a time. Is this possible?

So far I have been receiving the socket stream data from a NSFileHandle. I subscribe an object to receive the NSFileHandleReadCompletionNotification and get the NSData item from the notification. Then I initialize the XMLParser with the NSData. Will the NSXMLParser be able to parse correctly if I give it xml data 1 byte at a time? This might mean that the data I feed the XMLParser is cut in the middle of a tag or the contents.

- (void)xmlStream:(NSNotification *)notification
{
NSData *messageData = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];

if ( [messageData length] == 0 ) {
[xmlFileHandle readInBackgroundAndNotify];
return;
}

if(!xmlController)
{
xmlController = [[XMLcontroller alloc] init];
}

[xmlController initXMLparser: messageData];
[xmlController startParse];

[xmlFileHandle readInBackgroundAndNotify];
}



Inside my xml controller object

- (void) initXMLparser:(NSData *) xmlData
{
	if(!parser)
	{
		parser = [[NSXMLParser alloc] initWithData: xmlData];
		[parser setDelegate: self];
		[parser setShouldResolveExternalEntities:YES];
	}

	[parser initWithData: xmlData];

	nc = [NSNotificationCenter defaultCenter];
}

- (void) startParse
{
	[parser parse];
}

Any insights will be greatly appreciated.

Chris Woodruff

Jet Propulsion Laboratory
M/S: 138-206
4800 Oak Grove Dr.
Pasadena, CA 91109
818-354-2412


_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Follow-Ups:
    • Re: Is NSXMLParser really a streaming parser?
      • From: Christopher Woodruff <email@hidden>
References: 
 >Is NSXMLParser really a streaming parser? (From: Christopher Woodruff <email@hidden>)

  • Prev by Date: Re: [Leopard] GM Build Number?
  • Next by Date: Re: Xcode 3.0 delay
  • Previous by thread: Is NSXMLParser really a streaming parser?
  • Next by thread: Re: Is NSXMLParser really a streaming parser?
  • Index(es):
    • Date
    • Thread