Можно ли разделить файл на несколько файлов и дать им названия?

117
20 июля 2019, 19:40

Имеется огромный XML файл со следующей структурой:

<?xml version="1.0" encoding="UTF-8"?>
<Catalog>
<Category>
<Name>Cat 1</Name>
<Site>...</Site>
<Site>...</Site>
<Site>...</Site>
</Category>
<Category>
<Name>Cat 2</Name>
<Site>...</Site>
<Site>...</Site>
<Site>...</Site>
</Category>
<Category>
<Name>Cat 3</Name>
<Site>...</Site>
<Site>...</Site>
<Site>...</Site>
</Category>
</Catalog>

Можно ли его разделить с помощью PHP на несколько файлов так, чтобы в каждом файле сохранялась одна категория?

Например так:

cat_1.php

<?xml version="1.0" encoding="UTF-8"?>
<Catalog>
<Category>
<Name>Cat 1</Name>
<Site>...</Site>
<Site>...</Site>
<Site>...</Site>
</Category>
</Catalog>

cat_2.php

<?xml version="1.0" encoding="UTF-8"?>
<Catalog>
<Category>
<Name>Cat 2</Name>
<Site>...</Site>
<Site>...</Site>
<Site>...</Site>
</Category>
</Catalog>

cat_3.php

<?xml version="1.0" encoding="UTF-8"?>
<Catalog>
<Category>
<Name>Cat 3</Name>
<Site>...</Site>
<Site>...</Site>
<Site>...</Site>
</Category>
</Catalog>

Получаем XML файл

$url = 'https://site.ru/file.xml';

$fp = fopen("file.xml", "w");
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FILE, $fp);
$res = curl_exec($ch);
curl_close($ch);
//var_dump($res);
$file = 'file.xml'; // файл XML
$read = simplexml_load_file($file); // получаем объект класса

$xml = $read->Category; // $xml - объект-массив, вложенные теги - его свойства;
$count = count($xml); // кол-во элементов массива

Название файлам брать из названия категории <Name></Name>, чтобы каждый раз конкретные файлы отвечали за конкретные категории.

Подскажите можно ли реализовать и как?

Спасибо!

Answer 1

Если с помощью регулярных выражений, то вот вам вариант:

$str = <<<STR
<?xml version="1.0" encoding="UTF-8"?>
<Catalog>
<Category>
    <Name>Cat 1</Name>
    <Site>...</Site>
    <Site>...</Site>
    <Site>...</Site>
</Category>
<Category>
    <Name>Cat 2</Name>
    <Site>...</Site>
    <Site>...</Site>
    <Site>...</Site>
</Category>
<Category>
    <Name>Cat 3</Name>
    <Site>...</Site>
    <Site>...</Site>
    <Site>...</Site>
</Category>
</Catalog>
STR;
if (preg_match_all('~<Category>.+?</Category>~s', $str, $categories)) {
    foreach ($categories[0] as $category) {
        $temp = '<?xml version="1.0" encoding="UTF-8"?>' . "\n<Catalog>\n$category\n</Catalog>\n";
        preg_match('~<Name>(.+?)</Name>~', $category, $filename);
        $filename = str_replace(' ', '_', $filename[1]) . '.php';
        $filename = __DIR__ . DIRECTORY_SEPARATOR . $filename;
        file_exists($filename) ?: file_put_contents($filename, $temp);
    }
}
READ ALSO
Запрос к базе данных о пользователе [дубликат]

Запрос к базе данных о пользователе [дубликат]

На данный вопрос уже ответили:

130
значения dep drop при update в yii2

значения dep drop при update в yii2

у меня есть 3-х уровневый dep drop, при сохранении значения поступают в базу, но при update выходит значение только 1-вого уровня, а вот остальные два...

138
Social network subscribe mechanism

Social network subscribe mechanism

Ребят кто может объяснить как работает система подписок, ну чтобы отображалось число а при клике отображать их имена

125
Время выполнения методов [дубликат]

Время выполнения методов [дубликат]

На данный вопрос уже ответили:

164