DOMDocument, создайте новый узел элемента с несколькими ассоциированными пространствами имен - PullRequest
1 голос
/ 06 февраля 2020

Попытка создать эту структуру, используя DOMDocument.

<?xml version="1.0" encoding="UTF-8"?>

  <xbrli:xbrl
      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:xbrli       = "http://www.xbrl.org/2003/instance"
      xmlns:se-cd-base  = "http://www.taxonomier.se/se/fr/cd-base/2017-09-30"
  >

</xbrli:xbrl>

Мой текущий код:

$xml = new DomDocument('1.0', 'utf-8');
$xml->formatOutput = true;

$element = $xml->createElementNS('http://www.example.com/XFoo', 'xbrli:xbrl');
$xml->appendChild($element);

echo $xml->saveXML();

Результат:

<?xml version="1.0" encoding="utf-8"?>
<xbrli:xbrl xmlns:xbrli="http://www.xbrl.org/2003/linkbase"/>

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Вы можете добавить дополнительные пространства имен в качестве стандартных атрибутов:

$xml = new DomDocument('1.0', 'utf-8');
$xml->formatOutput = true;

$element = $xml->createElement('xbrli:xbrl');

$namespaceList = array(
    '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:xbrli'       => "http://www.xbrl.org/2003/instance",
    'xmlns:se-cd-base'  => "http://www.taxonomier.se/se/fr/cd-base/2017-09-30",
)
;

foreach($namespaceList as $key => $uri){
    $attr = $xml->createAttribute($key);
    $attr->value =  $uri;
    $element->appendChild($attr);
}

$xml->appendChild($element);

echo $xml->saveXML();

Вывод:

<?xml version="1.0" encoding="utf-8"?>
<xbrli:xbrl 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:xbrli="http://www.xbrl.org/2003/instance" xmlns:se-cd-base="http://www.taxonomier.se/se/fr/cd-base/2017-09-30"/>
0 голосов
/ 07 февраля 2020

Вы на правильном пути. Если вы работаете с пространствами имен, вам следует использовать методы, поддерживающие пространство имен (суффикс 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"/>
...