Разбор XML — Создание CSV из XML с использованием переполнения стека

У меня есть XML-файл, и я хочу преобразовать его в CSV-файл. Мой XML-файл представляет собой список продуктов с номером продукта и двумя типами атрибутов.

  1. attrtype=ProductattributeTypeTechData
  2. 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&quot;" 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&quot;" 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.

0

Решение

Я изменил код на следующий, и он работал для меня.

 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);

};
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector