I’m using the following code to convert my XML file to a CSV format. Unfortunately, it seems to not be recognizing each entry in the XML and so the XML file ends up being blank.
<?php $filexml='test.xml'; if (file_exists($filexml)) { echo 'File Exists'; $xml = simplexml_load_file($filexml); $f = fopen('test.csv', 'w'); foreach ($xml->Item as $item) { fputcsv($f, get_object_vars($item),',','"'); } fclose($f); } ?>
An example of my XML file is below…
<Item MaintenanceType="C"> <HazardousMaterialCode>N</HazardousMaterialCode> <ItemLevelGTIN GTINQualifier="UP">090127000380</ItemLevelGTIN> <PartNumber>0-1848-1</PartNumber> <BrandAAIAID>BBVL</BrandAAIAID> <BrandLabel>Holley</BrandLabel> <PartTerminologyID>5904</PartTerminologyID> <Descriptions> <Description MaintenanceType="C" DescriptionCode="DES" LanguageCode="EN">Street Carburetor</Description> <Description MaintenanceType="C" DescriptionCode="SHO" LanguageCode="EN">Crb</Description> </Descriptions> <Prices> <Pricing MaintenanceType="C" PriceType="JBR"> <PriceSheetNumber>L30779-13</PriceSheetNumber> <CurrencyCode>USD</CurrencyCode> <EffectiveDate>2013-01-01</EffectiveDate> <Price UOM="PE">462.4600</Price> </Pricing> <Pricing MaintenanceType="C" PriceType="RET"> <PriceSheetNumber>L30779-13</PriceSheetNumber> <CurrencyCode>USD</CurrencyCode> <EffectiveDate>2013-01-01</EffectiveDate> <Price UOM="PE">380.5500</Price> </Pricing> <Pricing MaintenanceType="C" PriceType="WD1"> <PriceSheetNumber>L30779-13</PriceSheetNumber> <CurrencyCode>USD</CurrencyCode> <EffectiveDate>2013-01-01</EffectiveDate> <Price UOM="PE">314.4700</Price> </Pricing> </Prices> <ExtendedInformation> <ExtendedProductInformation MaintenanceType="C" EXPICode="CTO" LanguageCode="EN">US</ExtendedProductInformation> <ExtendedProductInformation MaintenanceType="C" EXPICode="NPC" LanguageCode="EN">A</ExtendedProductInformation> <ExtendedProductInformation MaintenanceType="C" EXPICode="HTS" LanguageCode="EN">8409914000</ExtendedProductInformation> <ExtendedProductInformation MaintenanceType="C" EXPICode="NAF" LanguageCode="EN">B</ExtendedProductInformation> </ExtendedInformation> <ProductAttributes> <ProductAttribute MaintenanceType="C" AttributeID="SKU" LanguageCode="EN">BBVL0-1848-1</ProductAttribute> <ProductAttribute MaintenanceType="C" AttributeID="ModDate" LanguageCode="EN">2012-12-31</ProductAttribute> </ProductAttributes> <Packages> <Package MaintenanceType="C"> <PackageLevelGTIN>00090127000380</PackageLevelGTIN> <PackageUOM>EA</PackageUOM> <QuantityofEaches>1</QuantityofEaches> <Dimensions UOM="IN"> <Height>7.5000</Height> <Width>11.0000</Width> <Length>12.2500</Length> </Dimensions> <Weights UOM="PG"> <Weight>13.500</Weight> <DimensionalWeight>6.09</DimensionalWeight> </Weights> </Package> </Packages> </Item>
Any ideas what I did wrong?
Advertisement
Answer
Try this
function createCsv($xml, $f) { foreach ($xml->children() as $item) { $hasChild = (count($item->children()) > 0) ? true : false; if (!$hasChild) { $put_arr = array($item->getName(), $item); fputcsv($f, $put_arr, ',', '"'); } else { createCsv($item, $f); } } } $filexml = 'test.xml'; if (file_exists($filexml)) { $xml = simplexml_load_file($filexml); $f = fopen('test.csv', 'w'); createCsv($xml, $f); fclose($f); }