Re: Validating NSXMLDocument against external DTD
Re: Validating NSXMLDocument against external DTD
- Subject: Re: Validating NSXMLDocument against external DTD
- From: Rainer Standke <email@hidden>
- Date: Thu, 21 Jan 2010 19:54:33 -0800
This does indeed do the trick, what I had not done was setName on the
NSXMLDTD. Which, interestingly, has the effect of replacing the name
of the doc type with the full text of the dtd. In the case of a Final
Cut Pro XML that would turn this: <!DOCTYPE xmeml> into <!DOCTYPE
[full text of dtd here]>. This example would assume that you did
[myNSXMLDTD setName:@"xmeml"].
That strikes me as not entirely external anymore, since it will now
show up in string representations of the XML. But it works. Afterwards
the dtd can be taken out of the xml document's text by saying to the
NSXMLDocument setDTD:nil.
Thanks everyone for your help,
Rainer
On Jan 20, 2010, at 15:39 , Matt Neuburg wrote:
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
_______________________________________________
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