I have an array like so:
JavaScript
x
[0] => Array
(
[Project] => Array
(
[ExternalProjectID] => 53
[ProjectName] => Doon Creek
[Location] => Array
(
[Address] => 123 Fake Street
[City] => Toronto
[Province] => ON
[Latitude] => 43.0000
[Longitude] => -80.0000
)
[Website] => http://www.website.com/our-communities.php?newcommunity=53
[ContactInformation] => Array
(
[ContactPhone] => 555-5555
[ContactEmail] => email@email.com
[SalesOfficeAddress] => 123 Fake Street
[SalesOfficeCity] => Toronto
[SalesOfficeProvince] => ON
)
)
)
Now I am trying to covert this to XML exactly how this looks in the array, like Project should be a node with everything inside, Location should also be a node with everything inside the Location array inside that node, along with ContactInformation.
This is what I have:
JavaScript
$xml = new SimpleXMLElement();
$node = $xml->addChild('Projects');
array_to_xml($newArray, $node);
echo $xml->asXML();
die();
function array_to_xml($array, &$xml) {
foreach($array as $key => $value) {
if(is_array($value)) {
if(!is_numeric($key)){
$subnode = $xml->addChild("$key");
array_to_xml($value, $xml);
} else {
array_to_xml($value, $xml);
}
} else {
$xml->addChild("$key","$value");
}
}
}
but Project, Location and ContactInformation return as like so:
JavaScript
<Projects>
<Project />
<ExternalProjectID>53</ExternalProjectID>
<ProjectName>Doon Creek</ProjectName>
<Location />
<Address>123 Fake St.</Address>
<City>Toronto</City>
<Province>ON</Province>
<Latitude>43.0000</Latitude>
<Longitude>-80.000</Longitude>
<Website>http://www.website.com/our-communities.php?newcommunity=53</Website>
<ContactInformation />
<ContactPhone>555-5555</ContactPhone>
<ContactEmail>email@email.com</ContactEmail>
<SalesOfficeAddress>123 Fake Street</SalesOfficeAddress>
<SalesOfficeCity>Toronto</SalesOfficeCity>
<SalesOfficeProvince>ON</SalesOfficeProvince>
<Project />
</Projects>
My question is how do I fix my XML Output?
Advertisement
Answer
Almost had it! You simply had to pass the $subnode
, not $xml
into the recursive call of function:
JavaScript
// XML BUILD RECURSIVE FUNCTION
function array_to_xml($array, &$xml) {
foreach($array as $key => $value) {
if(is_array($value)) {
if(!is_numeric($key)){
$subnode = $xml->addChild($key);
array_to_xml($value, $subnode);
} else {
array_to_xml($value, $subnode);
}
} else {
$xml->addChild($key, $value);
}
}
}
// EXAMPLE ARRAY
$newArray = array(
"Project" =>
array("ExternalProjectID" => 53,
"ProjectName" => "Doon Creek",
"Location" =>
array ("Address" => "123 Fake Street",
"City" => "Toronto",
"Province" => "ON",
"Latitude" => 43.0000,
"Longitude" => -80.0000),
"Website" =>
"http://www.website.com/our-communities.php?newcommunity=53",
"ContactInformation" =>
array("ContactPhone" => "555-5555",
"ContactEmail" => "email@email.com",
"SalesOfficeAddress" => "123 Fake Street",
"SalesOfficeCity" => "Toronto",
"SalesOfficeProvince" => "ON")
)
);
// CREATING XML OBJECT
$xml = new SimpleXMLElement('<Projects/>');
array_to_xml($newArray, $xml);
// TO PRETTY PRINT OUTPUT
$domxml = new DOMDocument('1.0');
$domxml->preserveWhiteSpace = false;
$domxml->formatOutput = true;
$domxml->loadXML($xml->asXML());
echo $domxml->saveXML();
Output
JavaScript
<?xml version="1.0"?>
<Projects>
<Project>
<ExternalProjectID>53</ExternalProjectID>
<ProjectName>Doon Creek</ProjectName>
<Location>
<Address>123 Fake Street</Address>
<City>Toronto</City>
<Province>ON</Province>
<Latitude>43</Latitude>
<Longitude>-80</Longitude>
</Location>
<Website>http://www.website.com/our-communities.php?newcommunity=53</Website>
<ContactInformation>
<ContactPhone>555-5555</ContactPhone>
<ContactEmail>email@email.com</ContactEmail>
<SalesOfficeAddress>123 Fake Street</SalesOfficeAddress>
<SalesOfficeCity>Toronto</SalesOfficeCity>
<SalesOfficeProvince>ON</SalesOfficeProvince>
</ContactInformation>
</Project>
</Projects>