From e6ed9928a61b678fdadeda546933b1221b4385ad Mon Sep 17 00:00:00 2001 From: Rowan Collins Date: Sun, 2 Sep 2012 21:24:00 +0100 Subject: [PATCH] Improvements to namespace handling using new test case 21/08/2012 00:18 --- simplexml_dump.php | 75 ++++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/simplexml_dump.php b/simplexml_dump.php index e5e1419..a386a2c 100644 --- a/simplexml_dump.php +++ b/simplexml_dump.php @@ -54,27 +54,36 @@ function simplexml_dump(SimpleXMLElement $sxml) $dump .= $indent . $indent . 'String Content: \'' . (string)$item . '\'' . PHP_EOL; // Now some statistics about attributes and children, by namespace - $dump .= $indent . $indent . 'Structural Content:' . PHP_EOL; - - // If the default namespace is not declared, it will never show up using the below code - // (This is probably bad XML, or at least bad practice, but the aim here is to leave nothing invisible) - if ( ! array_key_exists('', $item->getDocNamespaces()) ) - { - $dump .= $indent . $indent . $indent . '[Default, Undeclared Namespace]' . PHP_EOL; - - $dump .= $indent . $indent . $indent . $indent . 'Children: ' . count($item->children(NULL)) . PHP_EOL; - $dump .= $indent . $indent . $indent . $indent . 'Attributes: ' . count($item->attributes(NULL)) . PHP_EOL; - } $all_ns = $item->getNamespaces(true); + // If the default namespace is never declared, it will never show up using the below code + // This will still mess up in the case where a parent element is missing the xmlns declaration, + // but a child adds it, because SimpleXML will look ahead and fill $all_ns[''] incorrectly + if ( ! array_key_exists('', $all_ns) ) + { + $all_ns[''] = NULL; + } + foreach ( $all_ns as $ns_alias => $ns_uri ) { - $ns_label = (($ns_alias == '') ? '[Default Namespace]' : "Namespace $ns_alias"); - $dump .= $indent . $indent . $indent . $ns_label . PHP_EOL; + $children = count($item->children($ns_uri)); + $attributes = count($item->attributes($ns_uri)); - $dump .= $indent . $indent . $indent . $indent . 'Namespace URI: \'' . $ns_uri . '\'' . PHP_EOL; - $dump .= $indent . $indent . $indent . $indent . 'Children: ' . count($item->children($ns_uri)) . PHP_EOL; - $dump .= $indent . $indent . $indent . $indent . 'Attributes: ' . count($item->attributes($ns_uri)) . PHP_EOL; + // Don't show zero-counts, as they're not that useful + if ( $children == 0 && $attributes == 0 ) + { + continue; + } + + $ns_label = (($ns_alias == '') ? 'Default Namespace' : "Namespace $ns_alias"); + $dump .= $indent . $indent . 'Content in ' . $ns_label . PHP_EOL; + + if ( ! is_null($ns_uri) ) + { + $dump .= $indent . $indent . $indent . 'Namespace URI: \'' . $ns_uri . '\'' . PHP_EOL; + } + $dump .= $indent . $indent . $indent . 'Children: ' . $children . PHP_EOL; + $dump .= $indent . $indent . $indent . 'Attributes: ' . $attributes . PHP_EOL; } $dump .= $indent . '}' . PHP_EOL; @@ -89,25 +98,27 @@ function simplexml_dump(SimpleXMLElement $sxml) } $x = << - - some text - ooo - - - - - - + + + + + + + + + 744 + 744 + + + + XML; $sx = simplexml_load_string($x); simplexml_dump($sx); -simplexml_dump($sx->children()); -simplexml_dump($sx->deeper); -simplexml_dump($sx->deeper->children('a', true)); -simplexml_dump($sx->bar[2]->attributes('b', true)); -simplexml_dump($sx->deeper['bob']); - +simplexml_dump($sx->children(NULL)); +simplexml_dump($sx->children("soapenv", true)->Body); +simplexml_dump($sx->children("soapenv", true)->Body->children(NULL)->requestContactResponse->requestContactReturn->id); +simplexml_dump($sx->children("soapenv", true)->Body->children(NULL)->requestContactResponse->requestContactReturn->children('soapenv', true)->id);