【问题标题】:DOMDocument - Create book, load chapters and appendDOMDocument - 创建书籍、加载章节和追加
【发布时间】:2020-02-21 20:08:13
【问题描述】:

需要使用 DOMDocument 来构造一本书,其中包含已加载和附加的章节。每章将存储在单独的 xml 文件中。下面将创建根书并附加第一个子章节_1。我知道“foreach”循环永远不会加载任何其他章节,因为它是为第 1 章硬编码的。

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

问题:

为了能够追加越来越多的章节,我需要在 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_(book).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>

【问题讨论】:

    标签: xml domdocument php-7.3


    【解决方案1】:

    您可以使用例如preg_grepscandir 组合来获取具有特定文件名的文件。

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

    【讨论】:

    • 更新了问题,目的是尽可能用 DOMDocument 解决。
    • @Toolbox 答案使用 DOMDocument。您想以不同的方式使用哪个部分?
    • 我猜它回答了这个问题。我的错误是以书为例。 “章节”说明了孩子,并且在我的真实代码中可能有其他名称的变体。我将继续批准并提出另一个问题。
    猜你喜欢
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 2023-03-09
    • 2017-01-12
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多