使用SimpleXML构建XBRL,如何实现名称空间

问题描述 投票:0回答:1

我正在使用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>
php arrays simplexml php-7.3
1个回答
1
投票

[在XML文档中使用名称空间时,您需要考虑三件事:

  • << [名称空间URI。这是工具将识别为相同名称空间的全局唯一标识符(URI不必指向任何地方,这只是组织谁“拥有”标识符的一种方式)。
  • << [本地前缀。这是一个任意字符串,
  • 特定文档甚至文档的一部分都与特定的名称空间URI相关联,基本上只是为了使事情更紧凑。这是:这样的标签中<xbrli:xbrl>之前的部分。对于文档的每个部分,对于没有前缀的元素,也都有一个默认的命名空间。
  • 该命名空间中的元素或属性名称。这是:等标记中<xbrli:xbrl>之后的部分。
  • 我提到所有这些都是为了理解为什么您提供的示例XML无效,因为它看起来像您想使用四个名称空间:

    您已给其本地前缀http://www.xbrl.org/2003/linkbase的名称空间link

    1. 您已给其本地前缀xbrli的未知名称空间;我称这个为http://example.org/xbrli
    2. 您已给其本地前缀se-cd-base的未知名称空间;我称这个为http://example.org/se-cd-base
    3. 您已给其本地前缀xlink的未知名称空间;我将其称为http://example.org/xlink(除非这是一个错字,并且应该是对http://www.xbrl.org/2003/linkbase的另一种引用?)
  • 现在让我们尝试使用SimpleXML构造XML的有效版本...
  • 首先,我们需要在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();
  • © www.soinside.com 2019 - 2024. All rights reserved.