我正在使用SimpleXML构造要用作XBRL的XML。
问题:
如何使用SimpleXML作为基础,以正确的方式在子元素上实现名称空间?
观察:
缺少名称空间(因此没有[xbrli:xbrl],[se-cd-base:CompanyName]。
缺少编码字符串。
我的代码:
<?php
$test_array = [
'TheCompany' => 'CompanyName'
];
$xml = new SimpleXMLElement('<xbrli/>');
array_walk_recursive($test_array, array ($xml, 'addChild'));
print $xml->asXML();
结果
<?xml version="1.0"?>
<xbrli>
<CompanyName>
TheCompany
</CompanyName>
</xbrli>
想要的结果(XBRL)
<?xml version="1.0" encoding="UTF-8"?>
<xbrli:xbrl xmlns:link = "http://www.xbrl.org/2003/linkbase">
<link:schemaRef
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
contextRef="period0">
TheCompany
</se-cd-base:CompanyName>
</xbrli:xbrl>
[在XML文档中使用名称空间时,您需要考虑三件事:
:
这样的标签中<xbrli:xbrl>
之前的部分。对于文档的每个部分,对于没有前缀的元素,也都有一个默认的命名空间。:
等标记中<xbrli:xbrl>
之后的部分。您已给其本地前缀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
的另一种引用?)http://example.org/xbrli
名称空间中创建根元素; SimpleXML没有创建没有任何节点的文档的方法,因此我们必须手动编写第一个节点并进行解析:// 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
。我们用passing the namespace as the third parameter to addChild
来做到这一点,如果需要的话,在元素名称中包括前缀:
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
与上面类似,但是前缀是必需的:
arguments to addAttribute
现在对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
现在将它们放在一起,并用unprefixed attributes have a rather odd definition in the namespaces spec进行检查,我们得到这样的内容(手动添加空格):
$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();