PHP XML 生成,链 `appendChild()`

Posted

技术标签:

【中文标题】PHP XML 生成,链 `appendChild()`【英文标题】:PHP XML generation, chain `appendChild()` 【发布时间】:2021-12-29 07:20:50 【问题描述】:

我正在通过 php 生成一个 XML 文件,我正在这样做:

$dom  = new DOMDocument();
$root = $dom->createElement('Root');
...
// some node definitions here etc
$root->appendChild($product);
$root->appendChild($quantity);
$root->appendChild($measureUnit);
$root->appendChild($lineNumber);
...
$dom->appendChild($root);
$dom->save( '/some/dir/some-name.xml');

一切正常,直到我遇到一些问题,当我到达我需要附加的部分时,比如说N 子节点。这意味着我也将调用函数 appendChild() 'N' 次 - 这导致了一个非常长的 php 脚本,这有点难以维护。

我知道我们可以将主脚本拆分为较小的文件以便更好地维护,但是有更好的方法来“链接”“appendChild”调用,这样可以节省大量的书面行,或者有一些神奇的功能,例如'appendChildren' 可用吗?

这是我第一次使用DOMDocument() 类,希望有人能给我一些启发。

谢谢

【问题讨论】:

不,您不能链接 appendChild 调用,因为该方法返回的是附加的节点,而不是您附加到的节点。 您当然可以先将所有需要追加的节点粘贴到一个数组中 - 然后循环该数组,并为循环体内的当前节点调用 appendChild。 哦,谢谢!是的,我们只是在此期间将它循环到一个数组中。我真的以为我们做错了什么 【参考方案1】:

您可以将DOMDocument::createElement() 嵌套到DOMNode::appendChild() 调用中并链接子节点或文本内容分配。

自 PHP 8.0 起,DOMNode::append() 可用于附加多个节点和字符串。

$document = new DOMDocument();
// nest createElement inside appendChild
$document->appendChild(
    // store node in variable
    $root = $document->createElement('root')
);

// chain textContent assignment to appendChild
$root
  ->appendChild($document->createElement('product'))
  ->textContent = 'Example';
  
// use append to add multiple nodes  
$root->append(
  $product = $document->createElement('measureUnit'),
  $quantity = $document->createElement('quantity'),  
);
$product->textContent = 'cm';
$quantity->textContent = '42';


$document->formatOutput= true;
echo $document->saveXML();

输出:

<?xml version="1.0"?>
<root>
  <product>Example</product>
  <measureUnit>cm</measureUnit>
  <quantity>42</quantity>
</root>

我正在使用可重用和可维护部件的接口,通常:

interface XMLAppendable 
    
    public function appendTo(DOMElement $parent): void;
    


class YourXMLPart implements XMLAppendable 
    
    private $_product;
    private $_unit;
    private $_quantity;
    
    public function __construct(string $product, string $unit, int $quantity) 
        $this->_product = $product;
        $this->_unit = $unit;
        $this->_quantity = $quantity;
    
    
    public function appendTo(DOMElement $parent): void 
        $document = $parent->ownerDocument; 
        $parent
            ->appendChild($document->createElement('product'))
            ->textContent = $this->_product;
        $parent
            ->appendChild($document->createElement('measureUnit'))
            ->textContent = $this->_unit;
        $parent
            ->appendChild($document->createElement('quantity'))
            ->textContent = $this->_quantity;
    



$document = new DOMDocument();
// nest createElement inside appendChild
$document->appendChild(
    // store node in variable
    $root = $document->createElement('root')
);
$part = new YourXMLPart('Example', 'cm', 42);
$part->appendTo($root);

$document->formatOutput= true;
echo $document->saveXML();

【讨论】:

以上是关于PHP XML 生成,链 `appendChild()`的主要内容,如果未能解决你的问题,请参考以下文章

PHP XML如何输出漂亮的格式

PHP 和 XMLWriter

JS获取XML节点值

php生成xml数据

PHP读取及生成xml文件实测

生成将使用 XMLWriter 生成目标 XML 的 PHP 代码