Re: SimpleXMLElement is not Simple



On Sep 28, 2:12 am, jeff...@xxxxxxxxxx (Jeffery Fernandez) wrote:
I am having nightmares with this bit off code.

The following code work perfectly fine:

$soap_request_string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"; xmlns:ns1="urn:Gateway_Proxy" xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:enc="http://www.w3.org/2003/05/soap-encoding";>
<env:Body>
<ns1:make_proxy_payment env:encodingStyle="http://www.w3.org/2003/05/soap-encoding";>
<payment_id>61ecc268-1cd0-f468</payment_id>
<payment_amount>15495</payment_amount>
<callback_query_string>&amp;payment_id=61ecc268-1cd0-f468</callback_query_string>
<transaction_note>Order from Student Library Fees with Payment Id: 61ecc268-1cd0-f468</transaction_note>
</ns1:make_proxy_payment>
</env:Body>
</env:Envelope>
XML;

$xml = new SimpleXMLElement($soap_request_string, NULL, false, 'http://www.w3.org/2003/05/soap-envelope');
print_r($xml);
$ns = $xml->getNamespaces(true);
//print_r($ns);

foreach ($xml->children($ns['env']) as $body)
{
//printf("%s<br />", $body->getName());

foreach ($body->children($ns['ns1']) as $function)
{
printf("function %s()<br />", $function->getName());

foreach ($function->children() as $parameters)
{
printf("%s => \"%s\"<br />", $parameters->getName(), $parameters);
}
}

}

However when the XML string is coming from the database it does not work. The Field and table have a collation of "utf8_unicode_ci"

$soap_request_string = trim(str_replace(array("\n"), '', $record['SoapRequestEnvelope']));
$xml = new SimpleXMLElement($soap_request_string, NULL, false, 'http://www.w3.org/2003/05/soap-envelope');
print_r($xml);

The above code is supposed to print out the following (for me to proceed further):

SimpleXMLElement Object
(
[Body] => SimpleXMLElement Object
(
)
)

but only returns:
SimpleXMLElement Object
(
)

The XL string from the database looks exactly like this (after replacing new lines):

<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"; xmlns:ns1="urn:Gateway_Proxy" xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:enc="http://www.w3.org/2003/05/soap-encoding";><env:Body><ns1:make_proxy_payment env:encodingStyle="http://www.w3.org/2003/05/soap-encoding";><payment_id>5ce30dcc-7df7-04e8</payment_id><payment_amount>10</payment_amount><callback_query_string>&amp;payment_id=5ce30dcc-7df7-04e8</callback_query_string><transaction_note>Order from Student Library Fees with Payment Id: 5ce30dcc-7df7-04e8</transaction_note></ns1:make_proxy_payment></env:Body></env:Envelope>

I can't figure out whats wrong with the code. Any suggestions?

cheers,
Jeffery
--
Internet Vision Technologies
Level 1, 520 Dorset Road
Croydon
Victoria - 3136
Australia

application_pgp-signature_part
1KDownload

Hi Jeffery,

If your having to much trouble with the simple XML parser then build
your own simple.
Here is a quick parser that pust the XML into a array
$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($xml_parser, $soap_request_string, $tags);
xml_parser_free($xml_parser);
$stack = array();
$elements = array();

foreach ( $tags as $tag ){
$index = count( $elements );
if ( $tag['type'] == "complete" || $tag['type'] == "open" ){
$elements[$index] = array();
$elements[$index]['name'] = $tag['tag'];
$elements[$index]['attributes'] = $tag['attributes'];
$elements[$index]['content'] = $tag['value'];

if ( $tag['type'] == "open" ){ # push
$elements[$index]['children'] = array();
$stack[count($stack)] = &$elements;
$elements = &$elements[$index]['children'];
}
}
if ( $tag['type'] == "close" ){ # pop
$elements = &$stack[count($stack) - 1];
unset($stack[count($stack) - 1]);
}
}
print_r($elements);

.