• 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: Validating NSXMLDocument against external DTD
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Validating NSXMLDocument against external DTD


  • Subject: Re: Validating NSXMLDocument against external DTD
  • From: Matt Neuburg <email@hidden>
  • Date: Wed, 20 Jan 2010 15:39:06 -0800
  • Thread-topic: Validating NSXMLDocument against external DTD

The DTD can be external, but you have to call setName: on it so that it is
coordinated with the root of your XML document. For example, suppose your
xml goes like this (ripped off the Internet, silly example):

<?xml version="1.0"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

And the dtd goes like this:

<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

Then this works:

NSURL* xmlurl = [[NSBundle mainBundle] URLForResource:@"xml"
withExtension:@"xml"];
NSXMLDocument* doc = [[NSXMLDocument alloc] initWithContentsOfURL:xmlurl
options:0 error:nil];
NSURL* dtdurl = [[NSBundle mainBundle] URLForResource:@"dtd"
withExtension:@"dtd"];
NSXMLDTD* dtd = [[NSXMLDTD alloc] initWithContentsOfURL:dtdurl options:0
error:nil];
[dtd setName:@"note"];
[doc setDTD:dtd];
BOOL valid = [doc validateAndReturnError:nil];
if (valid) NSLog(@"valid"); // "valid"

This point was well covered in a previous thread:

http://lists.apple.com/archives/cocoa-dev/2006/Sep/msg00464.html

m.


> Date: Tue, 19 Jan 2010 20:02:23 -0800
> From: Rainer Standke <email@hidden>
> Subject: Validating NSXMLDocument against external DTD
>
> Hello,
>
> I am trying to validate an NSXMLDocument against an external DTD. Here
> is what I do:
>
>     NSError *error = nil;
>
>      NSXMLDocument *doc = [[[NSXMLDocument alloc]
> initWithXMLString:beamedXML options:NSXMLNodeOptionsNone error:&error]
> autorelease];
>      if (!doc) {
>          NSLog(@"error: %@", error);
>      }
>
> NSXMLElement *root = [doc rootElement];
> //NSLog(@"%@", [root description]);
>
>
> //NSBundle *theBundle = [NSBundle mainBundle];
> //NSLog(@"%@", [theBundle description]);
>
> NSString *dtdPath = [[NSBundle mainBundle]
> pathForResource:@"FCPXMLv5" ofType:@"dtd"];
> NSLog(@"dtdPath: %@", dtdPath);
>
> NSURL *dtdUrl = [NSURL fileURLWithPath:dtdPath isDirectory:NO];
>
> error = nil;
> NSXMLDTD *theDtd = [[[NSXMLDTD alloc] initWithContentsOfURL:dtdUrl
> options:NSXMLNodePreserveWhitespace error:&error] autorelease];
> if (!theDtd) {
>          NSLog(@"error: %@", error);
>      }
> //NSLog(@"theDtd: %@", theDtd);
>
> [doc setDTD:theDtd];
>
> error = nil;
> if (! [doc validateAndReturnError:&error]) {
> NSLog(@"error: %@", error);
> }
>
> And this is what I get:
>
> Error Domain=NSXMLParserErrorDomain Code=1 UserInfo=0xdc17a50 "no DTD
> found!
>
> It seems to me that the DTD is expected to be found inside the XML
> document. (The DTD seems to be created alright, since I can log it's
> description.) In this case that not what I need or want. The Tree-
> Based XML Programming Guide for Cocoa talks about external DTDs but I
> can't find a clue as how to do this. Is it even possible?

--
matt neuburg, phd = email@hidden, http://www.tidbits.com/matt/
pantes anthropoi tou eidenai oregontai phusei
Among the 2007 MacTech Top 25, http://tinyurl.com/2rh4pf
AppleScript: the Definitive Guide, 2nd edition
http://www.tidbits.com/matt/default.html#applescriptthings
Take Control of Exploring & Customizing Snow Leopard
http://tinyurl.com/kufyy8
RubyFrontier! http://www.apeth.com/RubyFrontierDocs/default.html
TidBITS, Mac news and reviews since 1990, http://www.tidbits.com



_______________________________________________

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: Validating NSXMLDocument against external DTD
      • From: Rainer Standke <email@hidden>
  • Prev by Date: Re: Problem using bindings with deep key paths
  • Next by Date: iPhone:NSURLConnection and keep-alive
  • Previous by thread: Validating NSXMLDocument against external DTD
  • Next by thread: Re: Validating NSXMLDocument against external DTD
  • Index(es):
    • Date
    • Thread