note
arturo
<p>Going by the message and the documentation for the modules in question, it would not seem that the error message is incorrect or misleading. What you've passed in to the <code>validate</code> method of the <code>XML::LibXML::Document</code> object in your <code>eval</code> block is the <i>name</i> of a DTD file. But that's not the right sort of critter -- when it says it wants a DTD object, it wants a <code>XML::LibXML::Dtd</code> object, as is made manifest by the man page for <code>XML::LibXML::Document</code>
<pre>
You may also pass in a XML::LibXML::Dtd object,
to validate against an external DTD:
if (!$dom->is_valid($dtd)) {
warn("document is not valid!");
}
</pre>
</p>
<p>So yu need to get from the file to the object, and that you would do with something like:
<code>
eval {
$document = $parser->parse_file($file_target);
my $dtd = XML::LibXML::Dtd->new($dtd_file);
$document->validate($dtd);
};
</code>
<p>HTH!</p>
<p><b>Update</b>: whoops, no that isn't enough. In order to create a DTD object, you need both the PUBLIC id (e.g. <code>-//OASIS//DTD DocBook XML V4.1.2//EN</code> -- to pick a favourite of mine) and a SYSTEM id (which can be the name of the file, including all relevant path information). You can also read the file into a string and pass that in, but in testing I found that didn't play nicely if the DTD references entities defined in still other files.</p>
<p>Also, if the XML file has a DOCTYPE line in it,, that should be sufficient, since creating the DTD object is only necessary if that line is not present.</p>
<p>For more info, try <code>perldoc XML::LibXML::Dtd</code> on your system =)</p>
<p class="mysig">If not P, what? Q maybe? <br />"Sidney Morgenbesser"</p>
264027
264027