在for-loop中生成页面后填充页面内容

问题描述 投票:0回答:1

我需要使用DOMDocument来制作报表。由于页面会有所不同(3到30页之间),我想使用for-loop创建这些页面(数量由一个变量定义)。页面的生成工作正常。

作为第2步,我需要用内容填充这些页面。这些内容也将由DOMDocument来实现。由于我在for-loop中使用了"$page",我认为定义的节点值只被添加到最后的for-loop结果中是很自然的行为。

我加入了一个 "想要的结果",因为我知道我没有获得该结果的逻辑。

问题是,在填充后,是否可以将 "想要的结果 "添加到最后一个for循环结果中?

后填充是否可以只用DOMDocument来完成,或者我需要另一个工具,比如Xpath。

<?php

$totalPages = 3;

$xml = new DomDocument('1.0', 'UTF-8');
$xml->formatOutput = true;
$html = $xml->createElement('html');
$xml->appendChild($html);

$wrapper = $xml->createElement('div');
$wrapper->setAttribute('class', 'wrapper');
$html->appendChild($wrapper);

for ($i=1; $i <= $totalPages ; $i++) {

  $page = $xml->createElement('div');

  $page->setAttribute('class', 'pages');

  // $page->nodeValue = 'Content...'; // Kept as reference. Move to below populating.

  $page->setAttribute(
    'id',
    'page-' . $i
  );

  $wrapper->appendChild($page);

}

// Populate pages with content.
$page->nodeValue = 'Content...';
$wrapper->appendChild($page);

// Save & print.
$xml->save("result.xml");
echo $xml->saveHTML();

结果

<?xml version="1.0" encoding="UTF-8"?>
<html>
  <div class="wrapper">
    <div class="pages" id="page-1"/>
    <div class="pages" id="page-2"/>
    <div class="pages" id="page-3">Content...</div>
  </div>
</html>

想要的结果

<?xml version="1.0" encoding="UTF-8"?>
<html>
  <div class="wrapper">
    <div class="pages" id="page-1"/>Content page-1</div>
    <div class="pages" id="page-2"/>Content page-2</div>
    <div class="pages" id="page-3">Content page-3</div>
  </div>
</html>
php xml domdocument populate php-7.3
1个回答
0
投票

你可以存储对元素的引用创建的。创建元素,之后用它们来设置数值。

例如

$pages = [];
for ($i=1; $i <= $totalPages ; $i++) {
    $page = $xml->createElement('div');
    $pages[] = $page;

那么之后你可以做。

$pages[0]->nodeValue = 'Content page-1';

Php demo


0
投票

为了满足以后在DOMDocument中填充页面的需要,可以使用动态变量。这意味着你先创建所有的页面,由于它是循环的一部分,你可以构建任意多的页面。

每个页面都有一个变量名,例如(page_1, page_2等)可以让你选择你想填充的页面。因此,页面的填充可以在for-loop之外完成。

填充的来源可以是你选择的,例如DOMDocument,数组,从文件导入。

<?php

$totalPages = 3;

$xml = new DomDocument('1.0', 'UTF-8');
$xml->formatOutput = true;
$html = $xml->createElement('html');
$xml->appendChild($html);

$wrapper = $xml->createElement('div');
$wrapper->setAttribute('class', 'wrapper');
$html->appendChild($wrapper);

for ($i=1; $i <= $totalPages ; $i++) {

  ${'page_'.$i} = $xml->createElement('div');

  ${'page_'.$i}->setAttribute('class', 'pages');

  ${'page_'.$i}->setAttribute(
    'id',
    'page-' . $i
  );

  $wrapper->appendChild(
    ${'page_'.$i}
  );

}

// Populate pages with content.

$page_1->nodeValue = 'Content-page-1';
$wrapper->appendChild($page_1);

$page_2->nodeValue = 'Content-page-2';
$wrapper->appendChild($page_2);

$page_3->nodeValue = 'Content-page-3';
$wrapper->appendChild($page_3);

// Save & print.
$xml->save("result.xml");
echo $xml->saveHTML();

填充结果

<html>
<div class="wrapper">
 <div class="pages" id="page-1">Content-page-1</div>
 <div class="pages" id="page-2">Content-page-2</div>
 <div class="pages" id="page-3">Content-page-3</div>
</div>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.