使用简单XML构建XBRL,如何实现命名空间

我正在使用简单XML来构造要用作XBRL的XML。

问题:

如何使用 SimpleXML 作为基础,以正确的方式在子元素上实现命名空间?

观察:

  • 缺少命名空间(因此没有 [xbrli:xbrl], [se-cd-base:公司名称]。

  • 缺少编码字符串。

我的代码:


<?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>

通缉结果 (X巴西雷亚尔)


<?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>

慕勒3428872
浏览 128回答 1
1回答

喵喔喔

在 XML 文档中使用命名空间时,需要考虑三件事:命名空间 URI。这是工具将识别为同一命名空间的全局唯一标识符(URI不必指向任何地方,它只是一种组织谁“拥有”标识符的方式)。本地前缀。这是一个任意字符串,特定文档,甚至是文档的一部分,与特定的命名空间URI相关联,基本上只是为了保持更紧凑。这是 标记(如 ) 中的 前面部分。对于没有前缀的元素,文档的每个部分都有一个默认命名空间。:<xbrli:xbrl>该命名空间中的元素或属性名称。这是 在 标记(如 ) 之后的部分。:<xbrli:xbrl>我提到所有这些是为了理解为什么你提供的示例XML是无效的,因为它看起来像你想使用四个命名空间:已为其指定本地前缀的命名空间http://www.xbrl.org/2003/linkbaselink您为其指定了本地前缀的未知命名空间;我称之为xbrlihttp://example.org/xbrli您为其指定了本地前缀的未知命名空间;我称之为se-cd-basehttp://example.org/se-cd-base您为其指定了本地前缀的未知命名空间;我会称之为(除非这是一个错别字,应该是另一个参考?xlinkhttp://example.org/xlinkhttp://www.xbrl.org/2003/linkbase现在,让我们尝试使用简单 XML 构造 XML 的有效版本...首先,我们需要创建根元素,它位于命名空间中;SimpleXML没有办法创建没有任何节点的文档,因此我们必须手动编写第一个节点并解析它:http://example.org/xbrli// 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"/>');接下来,我们需要命名空间中的子元素。为此,我们将命名空间作为 addChild 的第三个参数传递,如果需要,请在元素名称中包含前缀:schemaRefhttp://www.xbrl.org/2003/linkbase// 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$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$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">&nbsp; &nbsp; <link:schemaRef&nbsp; &nbsp; &nbsp; &nbsp; xmlns:link="http://www.xbrl.org/2003/linkbase"&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; xmlns:xlink="http://example.org/xlink"&nbsp; &nbsp; &nbsp; &nbsp; xlink:type="simple"&nbsp; &nbsp; &nbsp; &nbsp; xlink:href="http://xbrl.taxonomier.se/se/fr/gaap/k2/risbs/2017-09-30/se-k2-risbs-2017-09-30.xsd"&nbsp; &nbsp; />&nbsp; &nbsp; <se-cd-base:CompanyName&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; xmlns:se-cd-base="http://example.org/se-cd-base"&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; contextRef="period0"&nbsp; &nbsp; >The Company&nbsp; &nbsp; </se-cd-base:CompanyName></xbrli>或者使用默认命名空间而不是前缀的等效文档:<?xml version="1.0"?><xbrli xmlns="http://example.org/xbrli">&nbsp; &nbsp; <schemaRef&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; xmlns="http://www.xbrl.org/2003/linkbase"&nbsp; &nbsp; &nbsp; &nbsp; xmlns:xlink="http://example.org/xlink"&nbsp; &nbsp; &nbsp; &nbsp; xlink:type="simple"&nbsp; &nbsp; &nbsp; &nbsp; xlink:href="http://xbrl.taxonomier.se/se/fr/gaap/k2/risbs/2017-09-30/se-k2-risbs-2017-09-30.xsd"&nbsp; &nbsp; />&nbsp; &nbsp; <CompanyName&nbsp; &nbsp; &nbsp; &nbsp; xmlns="http://example.org/se-cd-base"&nbsp; &nbsp; &nbsp; &nbsp; contextRef="period0"&nbsp; &nbsp; >&nbsp; &nbsp; The Company&nbsp; &nbsp; </CompanyName></xbrli>
打开App,查看更多内容
随时随地看视频慕课网APP