SimpleXML в CSV с отсутствующими тегами

Итак, у меня есть файл XML, который выглядит примерно так:

<container>
<example1>some text</example1>
<example2>some text</example2>
<example3>some text</example3>
<example4>some text</example4>
</container>
<container>
<example1>some text</example1>
<example2>some text</example2>
<example4>some text</example4>
</container>

По сути, если example3 не содержит никакой информации, автор XML решил полностью ее исключить. Проблема в том, что когда я использую свой скрипт для преобразования в CSV, этот конкретный XML-файл не преобразуется в CSV должным образом из-за того, что текст во втором example4 отображается под заголовком example3 в CSV-файле.

Это PHP-скрипт, который мне нужен, чтобы нормально работать с другими XML-файлами.

$file='input.xml';
if (file_exists($file)) {
    $xml = simplexml_load_file($file);
    $f = fopen('output.csv', 'w');

    // array to hold the field names
    $headers = array(); 
    // loop through the first set of fields to get names
    foreach ($xml->container->children() as $field) { 
        // put the field name into array
        $headers[] = $field->getName(); 
    }
    // print headers to CSV
    fputcsv($f, $headers, ',', '"');

    foreach ($xml->container as $information) {
        fputcsv($f, get_object_vars($information), ',', '"');
    }
    fclose($f);
}

Я не могу понять, как предварительно определить нужные мне заголовки и вставить правильную информацию в правильные столбцы в CSV.

Любые указатели очень ценятся.

Благодарность

Майк


person Mike Meade    schedule 30.09.2013    source источник


Ответы (1)


Если в вашей первой записи всегда представлены все поля, то достаточно перебрать поля заголовка для каждой строки и посмотреть, есть ли в текущей строке все записи.

foreach ($xml->container as $information) {
    $vars = get_object_vars($information);
    $line = array();
    foreach($headers as $field) {
        $line[] = isset($vars[$field]) ? $vars[$field] : '';
    }
    fputcsv($f, $line, ',', '"');
}
person a4c8b    schedule 30.09.2013