Так как данные каждого дочернего узла должны быть строкой в CSV, включая корневые данные корня, сначала вы можете захватить и сохранить корневые данные, а затем пройти по дочерним узлам и распечатать их данные с данными корня, предшествующими им.
Пожалуйста, проверьте следующий код:
$xml = simplexml_load_file("your_xml_file.xml") or die("Error: Cannot create object");
$csv_delimeter = ",";
$csv_new_line = "\n";
foreach($xml->children() as $n) {
$club_data = array();
$club_data[] = $n->name;
$club_data[] = $n->membership;
if (isset($n->boardMember)) {
foreach ($n->boardMember as $boardMember) {
$boardMember_data = $club_data;
$boardMember_data[] = $boardMember->name;
$boardMember_data[] = $boardMember->position;
echo implode($csv_delimeter, $boardMember_data).$csv_new_line;
}
}
else {
echo implode($csv_delimeter, $club_data).$csv_new_line;
}
}
После тестирования на примере данных xml сгенерировал следующий тип вывода:
Green Riders,Free,James F.,CEO
Green Riders,Free,Helen D., Associate Director
Broken Dice,Paid,Patrick B., CEO
Вы можете установить различные значения в зависимости от вашего сценария для:
$csv_delimeter = ",";
$csv_new_line = "\n";
Поскольку в выводе csv нет строгих правил - например, delimeter может быть ",", ",", ";" или "|" а также новая строка может быть "\ n \ r"
Коды печатают строки CSV один за другим на лету, но если вы хотите сохранить данные CSV в файл, то вместо записи строк один за другим, лучший подход - создать весь массив и записать это один раз (поскольку доступ к диску является дорогостоящим), если данные XML не являются большими. В сети вы получите множество простых примеров функций php array-to-csv.