У меня есть XML-файл, и я хочу преобразовать его в CSV-файл. Мой XML-файл представляет собой список продуктов с номером продукта и двумя типами атрибутов.
attrtype=ProductattributeTypeTechData
attrtype=ProductattributeTypeScopeSupply
Мне удалось получить все TypeTechData
атрибуты, потому что он должен быть все вместе в одном файле, но я не могу понять, как это сделать TypeScopeSupply
, Вот файл XML
<PRV proid="96801" id="96802" name="1.601-555.0 K 2.080">
<PRODUCT_NUMBER>16015550</PRODUCT_NUMBER>
<COLL languagespecific="" attrtype="ProductattributeTypeTechData" ProdID="96802" name="SPANNUNG_COLL" product_number="16015550" dictionary_entry="Voltage" dict_id="1775">
<PRAT languagespecific="0" attrtype="ProductattributeTypeTechData" datatype="N" ProdID="96802" name="SPANNUNG_VON" product_number="16015550">
<VALUE nr="1" unit="V" unit_id="3209" vo="" vo_id="">220</VALUE>
</PRAT>
</COLL>
<PRAT languagespecific="0" attrtype="ProductattributeTypeScopeSupply" datatype="F" ProdID="96802" name="INTEGRIERTER_FEINWASSERFILTER" product_number="16015550" dictionary_entry="Integrated fine mesh water filter" dict_id="2258">
<VALUE nr="1" unit="" unit_id="-1" vo="" vo_id="">1</VALUE>
</PRAT>
<PRAT languagespecific="0" attrtype="ProductattributeTypeScopeSupply" datatype="F" ProdID="96802" name="ADAPTER_GARTENSCHLAUCHANSCHLUSS_A3_4" product_number="16015550" dictionary_entry="Garden hose adapter A3/4"" dict_id="2113">
<VALUE nr="1" unit="" unit_id="-1" vo="" vo_id="">1</VALUE>
</PRAT>
<COLL languagespecific="" attrtype="ProductattributeTypeScopeSupply" ProdID="96802" name="QUICK_CONNECT_DUESEN_COLL" product_number="16015550" dictionary_entry="Kärcher Quick Connect standard nozzles" dict_id="44501">
<PRAT languagespecific="" attrtype="ProductattributeTypeScopeSupply" datatype="F" ProdID="96802" name="QUCK_CONNECT_DUESEN_0" product_number="16015550"/>
</COLL>
</PRV>
<PRV proid="188613" id="422136" name="1.602-103.0 K 2.090">
<PRODUCT_NUMBER>16021030</PRODUCT_NUMBER>
<COLL languagespecific="" attrtype="ProductattributeTypeTechData" ProdID="422136" name="SPANNUNG_COLL" product_number="16021030" dictionary_entry="Voltage" dict_id="1775">
<PRAT languagespecific="0" attrtype="ProductattributeTypeTechData" datatype="N" ProdID="422136" name="SPANNUNG_VON" product_number="16021030">
<VALUE nr="1" unit="V" unit_id="3209" vo="" vo_id="">220</VALUE>
</PRAT>
</COLL>
<PRAT languagespecific="0" attrtype="ProductattributeTypeScopeSupply" datatype="F" ProdID="422136" name="INTEGRIERTER_FEINWASSERFILTER" product_number="16021030" dictionary_entry="Integrated fine mesh water filter" dict_id="2258">
<VALUE nr="1" unit="" unit_id="-1" vo="" vo_id="">1</VALUE>
</PRAT>
<PRAT languagespecific="0" attrtype="ProductattributeTypeScopeSupply" datatype="F" ProdID="422136" name="ADAPTER_GARTENSCHLAUCHANSCHLUSS_A3_4" product_number="16021030" dictionary_entry="Garden hose adapter A3/4"" dict_id="2113">
<VALUE nr="1" unit="" unit_id="-1" vo="" vo_id="">1</VALUE>
</PRAT>
<PRAT languagespecific="0" attrtype="ProductattributeTypeScopeSupply" datatype="F" ProdID="422136" name="HOCHDRUCKPISTOLE" product_number="16021030" dictionary_entry="High-pressure gun" dict_id="2173">
<VALUE nr="1" unit="" unit_id="-1" vo="" vo_id="">1</VALUE>
</PRAT>
<PRAT languagespecific="0" attrtype="ProductattributeTypeScopeSupply" datatype="S" ProdID="422136" name="REINIGUNGSMITTELSCHLAUCH" product_number="16021030" dictionary_entry="Cleaning agent hose" dict_id="2344">
<VALUE nr="1" unit="" unit_id="-1" vo="" vo_id="">With filter</VALUE>
</PRAT>
<PRAT languagespecific="0" attrtype="ProductattributeTypeScopeSupply" datatype="F" ProdID="422136" name="EIN_FACH_STRAHLROHR" product_number="16021030" dictionary_entry="Single spray lance" dict_id="2247">
<VALUE nr="1" unit="" unit_id="-1" vo="" vo_id="">1</VALUE>
</PRAT>
<COLL languagespecific="" attrtype="ProductattributeTypeScopeSupply" ProdID="422136" name="QUICK_CONNECT_DUESEN_COLL" product_number="16021030" dictionary_entry="Kärcher Quick Connect standard nozzles" dict_id="44501">
<PRAT languagespecific="" attrtype="ProductattributeTypeScopeSupply" datatype="F" ProdID="422136" name="QUCK_CONNECT_DUESEN_0" product_number="16021030"/>
</COLL>
</PRV>
Что я действительно хочу, это сохранить каждый продукт в отдельном CSV, названном по идентификатору продукта
Где только данные для TypeScopeSupply
сохраняется, если оно имеет какое-либо значение и имеет заголовок как dictionaryentry
только для этих атрибутов. Как есть некоторые TypeScopeSupply
которые не имеют каких-либо значений или сказать пустым. Я не хочу, чтобы эти пустые атрибуты были отражены.
Другая вещь, которую стоит отметить, это значения для TypeScopeSupply
может как COLL-PRAT-VALUE
или просто PRAT-VALUE
,
Даже если бы я получил представление о том, как это сделать, я был бы признателен. Я специально разместил здесь более крупный файл XML, чтобы показать разнообразие атрибутов товара. Различные продукты имеют разные типы атрибутов.
<?php
$productfile = "Internet.xml";
//Build Product List
if (!$xml = simplexml_load_file($productfile)) {
echo "Unable to load XML file";
} else {
echo "<span style='white-space: nowrap'>";
$products = $xml->xpath('//PRV');
//Table Header
foreach ($products as $product) {
foreach ($product->COLL as $COLL) {
foreach ($COLL->PRAT as $PRAT){
if($COLL['attrtype']=="ProductattributeTypeScopeSupply"){
$headerarray[] = $COLL['dictionary_entry'];
}
};
};
foreach ($product->PRAT as $PRAT) {
if($PRAT['attrtype']=="ProductattributeTypeScopeSupply"){
$headerarray[] = $PRAT['dictionary_entry'];
}
};
};
echo "ID,";
$headerarray = array_values(array_unique($headerarray));
//Build Seperate header array for woocommerce display
$header = implode($headerarray,"|");
$header = str_replace(",","",$header);
$header = explode("|",$header);
echo implode(",",$header);
echo "<br>";
//Build Stats Array
foreach ($products as $product) {
echo($product->PRODUCT_NUMBER);
echo ",";
foreach ($product->COLL as $COLL) {
if($COLL['attrtype']=="ProductattributeTypeScopeSupply"){
$name = $COLL['dictionary_entry'];
$unit = "";
unset($values);
foreach ($COLL->PRAT as $PRAT){
foreach ($PRAT->VALUE as $VALUE) {
$values[] = (string)$VALUE . $VALUE['unit'];
};
};
$statsarray[(string)$name] = implode(array_filter($values),"|");
}
};
foreach ($product->PRAT as $PRAT) {
if($PRAT['attrtype']=="ProductattributeTypeScopeSupply"){
$name = $PRAT['dictionary_entry'];
$unit = "";
unset($values);
foreach ($PRAT->VALUE as $VALUE) {
$values[] = (string)$VALUE . $VALUE['unit'];
};
$statsarray[(string)$name] = implode(array_filter($values),"|");
}
};
//Compare against headers
$statsarray = str_replace(",",".",$statsarray);
$spreadsheetarray = array_fill(0, count($headerarray),"");
foreach ($statsarray as $description=>$value) {
$spreadsheetarray[array_search($description,$headerarray)]=$value;
};
foreach ($spreadsheetarray as $description=> $value) {
$spreadsheetarray[$description] = str_replace(',','.',$value);
//add column for woocommerce display
//$spreadsheetarray[$description] = ",".$value;
};
echo (implode($spreadsheetarray,","));
echo "<BR>";
unset($statsarray);
unset($spreadsheetarray);
};
echo "</span>";
//End XML if
};
?>
Это то, что мне удалось сделать .. Он выводит один CSV вместе с пустыми значениями, когда я просматриваю его в браузере. Все заголовки вместе со своими значениями (включая пустые значения печатаются здесь)
Я не знаю, как избежать пустых значений и их заголовков и поместить их в конкретный продукт CSV.
Я изменил код на следующий, и он работал для меня.
foreach ($product->COLL as $COLL) {
foreach ($COLL->PRAT as $PRAT){
if($COLL['attrtype']=="ProductattributeTypeScopeSupply"){
$headerarray[] = $COLL['dictionary_entry'];
}
};
};
foreach ($product->PRAT as $PRAT) {
if($PRAT['attrtype']=="ProductattributeTypeScopeSupply"){
$headerarray[] = $PRAT['dictionary_entry'];
}
};
//echo "ID,";
$headerarray = array_values(array_unique($headerarray));
foreach ($product->COLL as $COLL) {
if($COLL['attrtype']=="ProductattributeTypeScopeSupply"){
$name = $COLL['dictionary_entry'];
$unit = "";
unset($values);
foreach ($COLL->PRAT as $PRAT){
foreach ($PRAT->VALUE as $VALUE) {
if(!empty($name)) {
$values[] = (string)$VALUE.$VALUE['unit'];
}
};
};
$statsarray[(string)$name] = $name." ".implode(array_filter($values),"|");
}
};
foreach ($product->PRAT as $PRAT) {
if($PRAT['attrtype']=="ProductattributeTypeScopeSupply"){
$name = $PRAT['dictionary_entry'];
$unit = "";
unset($values);
foreach ($PRAT->VALUE as $VALUE) {
if(!empty($name)){
$values[] = $name." ". (string)$VALUE .$VALUE['unit'];
}
};
$statsarray[(string)$name] = implode(array_filter($values),"|");
}
};
$statsarray = str_replace(",",".",$statsarray);
foreach ($statsarray as $description=>$value) {
$spreadsheetarray[array_search($description,$headerarray)]=$value;
};
foreach ($spreadsheetarray as $description=> $value) {
$spreadsheetarray[$description] = str_replace(',','.',$value);
};
Других решений пока нет …