При использовании пространств имен в документе XML необходимо учитывать три вещи:
- URI пространства имен . Это глобально уникальный идентификатор, который инструменты распознают как одно и то же пространство имен (URI не должен нигде указывать, это просто способ организации того, кто «владеет» идентификатором).
- * местный префикс . Это произвольная строка, которая конкретный документ или даже часть документа ассоциируется с конкретным URI пространства имен, в основном просто для того, чтобы сделать вещи более компактными. Это часть перед тегом
:
в теге типа <xbrli:xbrl>
. Существует также пространство имен по умолчанию для каждой части документа, для элементов без префикса. - Элемент или имя атрибута в этом пространстве имен. Эта часть после
:
в теге, подобном <xbrli:xbrl>
.
Я упоминаю все это, чтобы понять, почему предоставленный вами образец XML недействителен, потому что похоже, что вы хотите используйте четыре пространства имен:
- Пространство имен
http://www.xbrl.org/2003/linkbase
, которому вы дали местный префикс link
- Неизвестное пространство имен, которому вы дали местный префикс
xbrli
; Я назову это http://example.org/xbrli
- Неизвестное пространство имен, которому вы дали местный префикс
se-cd-base
; Я назову это http://example.org/se-cd-base
- Неизвестное пространство имен, которому вы дали местный префикс
xlink
; Я назову это http://example.org/xlink
(если это не было опечаткой и не должно было быть другой ссылкой на http://www.xbrl.org/2003/linkbase
?)
Теперь давайте попробуем создать действительную версию вашего XML, используя Простой XML ...
Сначала нам нужно создать элемент root, который находится в пространстве имен http://example.org/xbrli
; Простой XML не может создать документ без каких-либо узлов, поэтому мы должны написать первый узел вручную и проанализировать его:
// Using xbrli as prefix for http://example.org/xbrli
$xml = new SimpleXMLElement('<xbrli xmlns="http://example.org/xbrli"/>');
// Or using http://example.org/xbrli as the default namespace for the document
$xml = new SimpleXMLElement('<xbrli xmlns="http://example.org/xbrli"/>');
Далее нам нужен дочерний элемент schemaRef
в http://www.xbrl.org/2003/linkbase
пространстве имен. Мы делаем это путем , передавая пространство имен в качестве третьего параметра в addChild
и включая префикс в имя элемента, если мы хотим его:
// Using link as the prefix for http://www.xbrl.org/2003/linkbase
$schemaRef = $xml->addChild('link:schemaRef', null, 'http://www.xbrl.org/2003/linkbase');
// Or making http://www.xbrl.org/2003/linkbase the default namespace for this section
$schemaRef = $xml->addChild('schemaRef', null, 'http://www.xbrl.org/2003/linkbase');
Далее мы хотим добавить атрибуты в пространстве имен http://example.org/xlink
. Аргументы для addAttribute
аналогичны приведенным выше, но префикс обязателен:
$schemaRef->addAttribute('xlink:type', 'simple', 'http://example.org/xlink');
$schemaRef->addAttribute('xlink:href', 'http://xbrl.taxonomier.se/se/fr/gaap/k2/risbs/2017-09-30/se-k2-risbs-2017-09-30.xsd', 'http://example.org/xlink');
Теперь повторите для элемента CompanyName
; обратите внимание, что атрибуты без префиксов имеют довольно странное определение в пространствах имен spe c, но мы сохраним его в соответствии с вашим примером:
$CompanyName = $xml->addChild('se-cd-base:CompanyName', 'The Company', 'http://example.org/se-cd-base');
// Again, we can declare a default namespace rather than a prefix:
$CompanyName = $xml->addChild('CompanyName', 'The Company', 'http://example.org/se-cd-base');
// Attribute with no namespace
$CompanyName->addAttribute('contextRef', 'period0');
Теперь соберите все вместе и проверьте с echo $xml->asXML();
и мы получаем что-то вроде этого (пробел добавляется вручную):
<?xml version="1.0"?>
<xbrli xmlns="http://example.org/xbrli">
<link:schemaRef
xmlns:link="http://www.xbrl.org/2003/linkbase"
xmlns:xlink="http://example.org/xlink"
xlink:type="simple"
xlink:href="http://xbrl.taxonomier.se/se/fr/gaap/k2/risbs/2017-09-30/se-k2-risbs-2017-09-30.xsd"
/>
<se-cd-base:CompanyName
xmlns:se-cd-base="http://example.org/se-cd-base"
contextRef="period0"
>The Company
</se-cd-base:CompanyName>
</xbrli>
Или эквивалентный документ, использующий пространства имен по умолчанию, а не префиксы:
<?xml version="1.0"?>
<xbrli xmlns="http://example.org/xbrli">
<schemaRef
xmlns="http://www.xbrl.org/2003/linkbase"
xmlns:xlink="http://example.org/xlink"
xlink:type="simple"
xlink:href="http://xbrl.taxonomier.se/se/fr/gaap/k2/risbs/2017-09-30/se-k2-risbs-2017-09-30.xsd"
/>
<CompanyName
xmlns="http://example.org/se-cd-base"
contextRef="period0"
>
The Company
</CompanyName>
</xbrli>