1 回答

TA貢獻1735條經驗 獲得超5個贊
在 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 的有效版本...
首先,我們需要創建根元素,它位于命名空間中;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">
<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>
- 1 回答
- 0 關注
- 167 瀏覽
添加回答
舉報