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()`的主要内容,如果未能解决你的问题,请参考以下文章