From: Robert Klemme Date: 2008-08-01T18:49:11+09:00 Subject: Re: libxml: is it possible not to use doctype declaration? 2008/7/30 Phill Davies : > ruud grosmann wrote: >> >> hi Phill, >> >> I've tried it right away. I ended up with the following: >> >> XML::Parser.default_load_external_dtd = false >> XML::Parser.default_validity_checking = false >> XML::Parser.default_substitute_entities = false >> >> parser = XML::Parser.file( file) >> #parser.default_substitute_entities = false >> #parser.default_load_external_dtd = false >> #parser.default_validity_checking = false >> doc = parser.parse >> node = doc.find( xpath).first >> >> But the script still tries to resolve the entity. The doctype >> definition is a slightly changed real one. The message I get with the >> above code is: >> >> Operation in progress./tmp/ut21.uit:3: I/O warning : failed to load >> external entity "http://ruud.grosmann.nl/op/dtd/publicatie.dtd" >> e publicaties 1.0//NL" "http://ruud.grosmann.nl/op/dtd/publicatie.dtd" >> >> You were right that the methods are not instance methods, although I >> am not sure how to conclude that from the documentation. >> >> Did I something wrong in the script? >> >> regards, Ruud >> >> On 30/07/2008, Phill Davies wrote: >> >>> >>> Whoops, those were supposed to be class variables. What you really want >>> to do (I think) is more like: >>> >>> LibXML::XML::Parser.default_load_external_dtd = false >>> LibXML::XML::Parser.default_validity_checking = false >>> >>> And then: >>> parser = LibXML::XML::Parser.file() >>> doc = parser.parse >>> >>> That seems to work with your example. >>> >>> Phill Davies wrote: >>> >>>> >>>> To start, the rdoc documentation can be found at >>>> http://libxml.rubyforge.org/rdoc/index.html. Now I don't know this for >>>> sure, but >>>> >>>> >>> "http://some.site.nl/dtd/test.dtd"> >>>> >>>> doesn't look like a real doctype definition, so if you can pull it out >>>> of your xml (by hand, not programmatically) before trying to parse it, >>>> I'd say that would be a good idea. That being said, there are two >>>> attributes of the XML::Parser class that look like they may be of >>>> interest: default_load_external_dtd and default_validity_checking. Try >>>> setting both of those to false, unless you have a real dtd to validate >>>> against and the example above was fake. Of course, since this is using >>>> XML::Parser instead of XML::Document I think you would need to do >>>> e.g.: parser = XML::Parser.file() >>>> parser.default_load_external_dtd = false >>>> parser.default_validity_checking = false >>>> doc = parser.parse >>>> >>>> ... and then go from there. >>>> Phill D. >>>> >>>> Phlip wrote: >>>> >>>>> >>>>> ruud grosmann wrote: >>>>> >>>>> >>>>>> >>>>>> Is using libxml the right thing to do to, or are there smarter >>>>>> alternatives? >>>>>> >>>>> >>>>> Libxml-ruby is the most complete & accurate parser of the big three >>>>> (REXML, Libxml-ruby, and Hpricot), and its documentation can be very >>>>> challenging. How much of the original C Libxml documentation have you >>>>> been able to read? >>>>> >>>>> >>>>> >>>> >>>> >>> >>> >> >> >> > > Hey Ruud, > Nope, I can't see that you're doing anything wrong. I guess all I can say > is if can send the actual XML so I can give it a try with it (because when I > use your original example it seems to work fine as long as I set those class > variables). Also, the error message you sent was broken up, if you could > please try to send that again it would probably help. Here's what I'm using: > > "http://some.site.nl/dtd/test.dtd"> > >

this is a test

>
> > And here's the error I get when I don't set those class variables: > > test.xml:2: > I/O > warning : > failed to load HTTP resource > TYPE test PUBLIC "-//FARAWAY//DTD-verweg//NL" > "http://some.site.nl/dtd/test.dtd" Hm, Java XML parsers I know have a special callback that you can set that will deal with resolving external entities. I could not find anything similar in libxml documentation but maybe I just looked in the wrong places. With that you could load the file just once (or even fetch it from some internal memory or file system). Also, I find it a bit strange that those flags are global - this can introduce weird bugs when using an application which parses XML concurrently and needs different flags for each process... Kind regards robert -- use.inject do |as, often| as.you_can - without end