Parser.XML.Validating bails out with error for invalid content within nameless context
Imported from http://bugzilla.roxen.com/bugzilla/show_bug.cgi?id=4576
Reported by Erik Forsberg, Opera Software forsberg@opera.com
Running this example script:
--begin example--
#!/usr/bin/env pike
class MyValidatingParser {
inherit Parser.XML.Validating;
string get_external_entity(string sysid, string|void pubid,
int|void unparsed, mixed ... extra)
{
Standards.URI uri = Standards.URI(sysid);
if(uri->scheme == "http") {
Protocols.HTTP.Query q = Protocols.HTTP.get_url(uri);
if(q->status == 200)
return q->data();
}
return 0;
}
}
int main(int argc, array(string) argv)
{
string example = #"
<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\"
\"http://www.wapforum.org/DTD/wml_1.1.xml\">
<wml>
<card id=\"menu\" title=\"title\">
not allowed here
</card>
</wml>";
int num_errors=0;
MyValidatingParser p = MyValidatingParser();
p->parse(example,
lambda(string kind, string name, mapping attributes,
array|string contents,mapping(string:mixed) info) {
if(kind=="error") {
werror("Error: %s, character position: %d\n",
contents, info->location);
num_errors++;
}
});
if(!num_errors) write("Validated ok.\n");
return num_errors;
}
--end example--
I get the following traceback:
--begin traceback--
sprintf: Wrong type for argument 2: expected string, got int.
/usr/local/pike/7.7.85/lib/modules/Parser.pmod/XML.pmod/
Validating.pike:262:
/main()->MyValidatingParser()->__lambda_65649_2_line_261("Invalid
content
for element
%s.",0)
/usr/local/pike/7.7.85/lib/modules/Parser.pmod/XML.pmod/
Validating.pike:391:
/main()->MyValidatingParser()->validate
("",0,0,"\n"
"not allowed here\n",mapping[1],/main()->__lambda_65637_0_line_33,
({}))
export/spare/pike/data/pikefarm/out_work/7.7/Pike/7.7/src/modules/Parser/
xml.cmod:943:
/main()->MyValidatingParser()->Context()->parse_xml
()
validate_xml.pike:3:
/main()->MyValidatingParser()->parse(/main()->MyValidatingParser()-
>Contex
t
())
/usr/local/pike/7.7.85/lib/modules/Parser.pmod/XML.pmod/
Validating.pike:444:
/main()->MyValidatingParser()->parse
("\n"
"<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN
\"\n"
" \"http://www.wapforum.org/DTD/wml_1.1.xml\">
\n"
"<wml>
\n"
"<card id=\"menu\" title=\"title\">
\n"
"not allowed here
\n"
"</"+[13],@0)
validate_xml.pike:40:
/main()->main(1,({"/home/forsberg/dev/validate_xml.pike"}))
--end traceback--