DOMDocument - создайте книгу, загрузите главы и добавьте - PullRequest
0 голосов
/ 21 февраля 2020

Необходимо использовать DOMDocument для создания книги с загруженными и добавленными главами. Каждая глава будет храниться в отдельном файле xml. Ниже будет создана книга root и добавлен первый дочерний раздел_1. Я понимаю, что «foreach» -l oop никогда не будет загружать никакие другие главы, так как он жестко задан для chapter_1.

Цель состоит в том, чтобы решить проблему с помощью DOMDocument, чтобы позаботиться о правильном переносе тегов. Я знаю, что мог бы в этом случае использовать PHP include для всех глав и включать root в начале и в конце (в качестве оболочки).

Вопрос:

Что мне нужно изменить в for-l oop, чтобы иметь возможность добавлять растущее количество глав? Должен ли я сначала указать массив и выполнить «foreach» -l oop для перебора массива?

Мой код:

Файл: объединить. php

<?php

$book = new DOMDocument();
$book->load('1_build_block_(book).xml');

$chapter_1 = new DOMDocument();
$chapter_1->load('2_build_block_(chapter_1).xml');

$chapter_2 = new DOMDocument();
$chapter_2->load('3_build_block_(chapter_2).xml');

// chapter_3, chapter_4, etc...

/**
 * Merge chapters into book.
 */

foreach ($chapter_1->childNodes as $child) {
    $book->documentElement->appendChild(
        $book->importNode($child, TRUE)
    );
}

echo $book->saveXML();
$book->saveHTMLFile("result.xml");

Файл: 1_build_block_ (книга). xml

<book></book>

Файл: 2_build_block_ (chapter_1). xml

<chapter_1></chapter_1>

Файл: 3_build_block_ (chapter_2). xml

<chapter_2></chapter_2>

Результат:

<book>
  <chapter_1></chapter_1>
</book>

Требуемый результат:

<book>
  <chapter_1></chapter_1>
  <chapter_2></chapter_2>
</book>

1 Ответ

0 голосов
/ 23 февраля 2020

Вы можете использовать, например, preg_grep в сочетании с scandir , чтобы получить файлы с указанными c именами файлов.

Если файлы находятся в одном и том же dir, вы можете использовать этот шаблон только для получения глав, где \d+ соответствует 1 или более цифрам.

^\d+_build_block_\(chapter_\d+\)\.xml$

Regex demo

$book = new DOMDocument();
$book->load('1_build_block_(book).xml');
$path = "./";
$chapters = preg_grep('~^\d+_build_block_\(chapter_\d+\)\.xml$~', scandir("./"));

foreach ($chapters as $chapter) {
    $doc = new DOMDocument();
    $doc->load($chapter);
    foreach ($doc->childNodes as $child) {
        $book->documentElement->appendChild(
            $book->importNode($child, TRUE)
        );
    }
}

echo $book->saveXML();
$book->saveHTMLFile("result.xml");

Вывод

<?xml version="1.0"?>
<book><chapter_1/><chapter_2/></book>
...