|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2021-08-11 19:04 UTC] dave dot lampert at rpm6 dot com
Description: ------------ --- From manual page: https://php.net/function.xml-parse --- If xml_parse tries to parse XML containing <X xmlns="something">, it sees that "something" doesn't start with "http://" or "https://", so xml_parse returns 0; however, xml_get_error_code also returns 0 ("No error"). This only happens when parsing in fragments near that bad XML namespace. Test script: --------------- <?php class XMLProcessor { public function test() { $bad_xmlns = true; $parser = xml_parser_create_ns('UTF-8'); xml_set_object($parser, $this); $success = xml_parse($parser, '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><X xmlns="'.($bad_xmlns ? '' : 'http://').'example.org"><', false); $code = xml_get_error_code($parser); $error = xml_error_string($code); echo "xml_parse returned $success, xml_get_error_code = $code, xml_error_string = $error\r\n"; $success = xml_parse($parser, 'Y>', false); $code = xml_get_error_code($parser); $error = xml_error_string($code); echo "xml_parse returned $success, xml_get_error_code = $code, xml_error_string = $error\r\n"; } } (new XMLProcessor())->test(); Expected result: ---------------- xml_parse returned 1, xml_get_error_code = 0, xml_error_string = No error xml_parse returned 0, xml_get_error_code = {some number), xml_error_string = {some description} Actual result: -------------- xml_parse returned 1, xml_get_error_code = 0, xml_error_string = No error xml_parse returned 0, xml_get_error_code = 0, xml_error_string = No error PatchesPull Requests
Pull requests:
HistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 17:00:01 2025 UTC |
I can confirm the behavior. The problem is the handling of warnings. xml_get_error_code() returns 0 for these, but xml_parse() bails out early, if a warning had already been raised. You can see that when dumping the result of libxml_get_last_error() after the first xml_parse(): object(LibXMLError)#2 (6) { ["level"]=> int(1) ["code"]=> int(100) ["column"]=> int(239) ["message"]=> string(39) "xmlns: URI example.org is not absolute " ["file"]=> string(0) "" ["line"]=> int(1) } Ah, actually this is a regression by an unappropriate fix for bug #73135.