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$
$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>
需要使用 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$
$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>