Вы на правильном пути. Если вы работаете с пространствами имен, вам следует использовать методы, поддерживающие пространство имен (суффикс NS
). Это добавит определения пространств имен неявно (при использовании). Вы все еще можете определить их явно, установив их как атрибут:
$document = new DOMDocument('1.0', 'UTF-8');
$document->formatOutput = true;
// append returns the node, the create call can be nested
$element = $document->appendChild(
// use the namespace aware method - this will add the namespace definition as needed
$document->createElementNS('http://www.xbrl.org/2003/instance', 'xbrli:xbrl')
);
$namespaces = [
'link' => "http://www.xbrl.org/2003/linkbase",
'se-gen-base' => "http://www.taxonomier.se/se/fr/gen-base/2017-09-30",
'iso4217' => "http://www.xbrl.org/2003/iso4217",
'xlink' => "http://www.w3.org/1999/xlink",
// 'xbrli' => "http://www.xbrl.org/2003/instance",
'se-cd-base' => "http://www.taxonomier.se/se/fr/cd-base/2017-09-30",
];
foreach ($namespaces as $prefix => $namespaceURI) {
// namespace definitions use a resevered namespace
$element->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:'.$prefix, $namespaceURI);
};
echo $document->saveXML();
Вывод:
<?xml version="1.0" encoding="UTF-8"?>
<xbrli:xbrl xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:se-gen-base="http://www.taxonomier.se/se/fr/gen-base/2017-09-30" xmlns:iso4217="http://www.xbrl.org/2003/iso4217" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:se-cd-base="http://www.taxonomier.se/se/fr/cd-base/2017-09-30"/>