DOMDocument - 创建书籍、加载章节并追加

DOMDocument - Create book, load chapters and append

需要使用 DOMDocument 来构建带有加载和附加章节的书籍。每章将存储在单独的 xml 文件中。下面将创建根书并附加第一个子书 chapter_1。我知道 "foreach"-loop 永远不会加载任何其他章节,因为它是针对 chapter_1.

进行硬编码的

目的是解决使用 DOMDocument 处理正确标签包装的问题。我知道在这种情况下我可以对所有章节使用 PHP include,并在开头和结尾包含 root(作为包装器)。

问题:

我需要在 for 循环中更改什么才能附加越来越多的章节?我需要先指定一个数组然后执行 "foreach" 循环来遍历数组吗?

我的代码:

文件:merge.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>

例如,您可以使用 preg_grep in combination with scandir 来获取具有特定文件名的文件。

如果文件在同一目录中,您可以使用此模式仅获取章节,其中 \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>