%s",
$this::ATOM_NAMESPACE,
$this::ITUNES_NAMESPACE,
$this::PODCAST_NAMESPACE,
$contents
));
}
/**
* Adds a child with $value inside CDATA
*
* @param string $name — The name of the child element to add.
* @param string $value — [optional] If specified, the value of the child element.
* @param string|null $namespace [optional] If specified, the namespace to which the child element belongs.
*
* @return static The addChild method returns a SimpleXMLElement object representing the child added to the XML node.
*/
public function addChildWithCDATA(string $name, string $value = '', ?string $namespace = null): static
{
$newChild = parent::addChild($name, null, $namespace);
$node = dom_import_simplexml($newChild);
$no = $node->ownerDocument;
if ($no instanceof DOMDocument) {
$node->appendChild($no->createCDATASection($value));
}
return $newChild;
}
/**
* Adds a child element to the XML node with escaped $value if specified. Override of addChild method as
* SimpleXMLElement's addChild method doesn't escape ampersand
*
* @param string $name — The name of the child element to add.
* @param string $value — [optional] If specified, the value of the child element.
* @param string $namespace [optional] If specified, the namespace to which the child element belongs.
* @param boolean $escape [optional] The value is escaped by default, can be set to false.
*
* @return static The addChild method returns a SimpleXMLElement object representing the child added to the XML node.
*/
#[Override]
public function addChild($name, $value = null, $namespace = null, $escape = true): static
{
$newChild = parent::addChild($name, null, $namespace);
$node = dom_import_simplexml($newChild);
$no = $node->ownerDocument;
$value = $escape ? esc($value ?? '') : $value ?? '';
if (! $no instanceof DOMDocument) {
return $newChild;
}
if (is_array($value)) {
return $newChild;
}
$node->appendChild($no->createTextNode($value));
return $newChild;
}
/**
* Add RssFeed code into a RssFeed
*
* adapted from: https://stackoverflow.com/a/23527002
*
* @param self|array $nodes
*/
public function appendNodes(self|array $nodes): void
{
if (! is_array($nodes)) {
$nodes = [$nodes];
}
foreach ($nodes as $element) {
$namespaces = $element->getNamespaces();
$namespace = $namespaces[array_key_first($namespaces)] ?? null;
if (trim((string) $element) === '') {
$simpleRSS = $this->addChild($element->getName(), null, $namespace);
} else {
$simpleRSS = $this->addChild($element->getName(), (string) $element, $namespace);
}
foreach ($element->children() as $child) {
$simpleRSS->appendNodes($child);
}
foreach ($element->attributes() as $name => $value) {
$simpleRSS->addAttribute($name, (string) $value);
}
}
}
}