|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2006-02-13 15:24 UTC] rele at gmx dot de
Description: ------------ I want to parse SVG XML code with SimpleXML, but under certain circumstances the parsed SimpleXMLElements do not contain either attributes or child tags. Reproduce code: --------------- $test_simplexml_errors_svg = <<<EOD <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"[ <!ENTITY E1 'font-size:7pt'> ]> <svg id="svg_output" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="-2 -7 1561 708"> <text id="1a" style="&E1;" x="300" y="100">ParentText <tspan id="2a" dy="12" x="310">ChildText1</tspan><tspan id="3a" dy="12" x="350"> </tspan></text> <text id="1b" style="&E1;" x="400" y="200"><tspan id="2b" dy="12" x="410">ChildText1</tspan><tspan id="3b" dy="12" x="450"> </tspan></text> <text id="1c" style="&E1;" x="500" y="300"><tspan id="2c" dy="12" x="510">ChildText1</tspan><tspan id="3c" dy="12" x="550">ChildText2</tspan></text> </svg> EOD; print_r(simplexml_load_string($test_simplexml_errors_svg)); Expected result: ---------------- SimpleXMLElement Object ( [@attributes] => Array ( [id] => svg_output [version] => 1.1 [viewBox] => -2 -7 1561 708 ) [text] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 1a [style] => font-size:7pt [x] => 300 [y] => 100 ) [0] => ParentText ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 1b [style] => font-size:7pt [x] => 400 [y] => 200 ) [tspan] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 2b [dy] => 12 [x] => 410 ) [0] => ChildText1 ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 3b [dy] => 12 [x] => 450 ) [0] => ) ) ) [2] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 1c [style] => font-size:7pt [x] => 500 [y] => 300 ) [tspan] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 2c [dy] => 12 [x] => 510 ) [0] => ChildText1 ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 3c [dy] => 12 [x] => 550 ) [0] => ChildText2 ) ) ) ) ) Actual result: -------------- SimpleXMLElement Object ( [@attributes] => Array ( [id] => svg_output [version] => 1.1 [viewBox] => -2 -7 1561 708 ) [text] => Array ( [0] => ParentText [1] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 1b [style] => font-size:7pt [x] => 400 [y] => 200 ) [tspan] => Array ( [0] => ChildText1 [1] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 3b [dy] => 12 [x] => 450 ) [0] => ) ) ) [2] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 1c [style] => font-size:7pt [x] => 500 [y] => 300 ) [tspan] => Array ( [0] => ChildText1 [1] => ChildText2 ) ) ) ) PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Nov 02 21:00:02 2025 UTC |
I tried the code with the 5.2.0RC2-dev Win32 build (Date => Jul 27 2006 04:15:19), but it produced the same result, and $parent[0] was always NULL, too. In addition I had to modify the second example code from foreach($simplexml as &$parent) { to foreach($simplexml as $parent) { because it produced: PHP Fatal error: An iterator cannot be used with foreach by referenceHere is a simplified version, which only shows the missing child nodes (so I will check attributes again once this is working). XPath seems to be working. The dynamic $parent->$key[$i] access is only working for $i=0, otherwise "Notice: Uninitialized string offset" occurs. Reproduce code: --------------- $test_simplexml_errors = <<<EOD <?xml version="1.0"?> <t> <p>PARENT<c>CHILD</c></p> <p><c>CHILD1</c><c> </c></p> <p> <c>CHILD1</c><c/></p> <p><c><d/><d/></c><c/></p> </t> EOD; $simplexml = simplexml_load_string($test_simplexml_errors); // print_r($simplexml); foreach($simplexml as $parent) { echo $parent->asXML(), "\n"; //text node: '", (string) $parent, "'\n"; if( ((string) $parent) && ! array_key_exists(0, $parent)) echo "ERROR: No text child node with index 0 found\n"; $children = $parent->children(); $key = $children[0]->getName(); if(! array_key_exists($key, $parent)) echo "ERROR: No child node with key '$key' found\n"; $child_count = count($parent->xpath($key)); for($i = 0; $i < $child_count; $i++) { if(! array_key_exists($i, $parent->$key) && ($child_count != 1 || (string) $parent->$key) ) echo "ERROR: No child node with index $i found\n"; // echo "child $i direct: ", $parent->c[$i]->asXML(),"\n"; // echo "child $i dynamic: ", $parent->$key[$i]->asXML(),"\n"; } foreach($parent as $child) { // echo ' child: ', $child->asXML(), "\n child text node: '", (string) $child, "'\n"; if($child->xpath('text()') && ! array_key_exists(0, $child)) { echo "ERROR: No text child element with index 0 found\n"; // echo $child->asXML(), "\n"; } $child_count = count($child->xpath('./*')); if($child_count) { $children = $child->children(); $key = $children[0]->getName(); for($i = 0; $i < $child_count; $i++) { if(! array_key_exists($i, $child->$key) && ($child_count != 1 || (string) $child->$key) ) echo "ERROR: No sub child node with index $i found\n"; // echo "sub child $i direct: ", $child->d[$i]->asXML(),"\n"; // echo "sub child $i variable: ", $child->$key[$i]->asXML(),"\n"; } } } }