Search Posts

Visits: 676

XBRL GLインスタンス文書のデータベース登録

期間別・科目別に文書をまとめて表示させるため、データベースを使用します。
ここでは、サーバーにアップロードしたインスタンス文書をPHPのDOMのXML機能を使って解析し、PostgreSQLに登録しました。

DOMで名前空間付きの要素を処理するために、
$glcor = ‘http://www.xbrl.org/taxonomy/int/gl/cor/2003-08-29/’;
$dom -> getElementsByTagNameNS($glcor, ‘accountingEntries’);
といった方法で、getElementsByTagNameNSを使用しました。
entryDetails要素までの階層の繰り返しは、(1/3)の投稿と同じイメージです。

PostgreSQLデータベースへは、PDOで接続していますので、
$stmt = $pdo -> prepare($sql);
のようなコーディングで、SQL文を実行します。

[php] DOMを使用したXML解析とPDOでのデータベース登録<抜粋>


    $dom = new DOMDocument;
    $dom->load($filename);

    $glcor = 'http://www.xbrl.org/taxonomy/int/gl/cor/2003-08-29/';
    $glbus = 'http://www.xbrl.org/taxonomy/int/gl/bus/2003-08-29/';
    $glmuc = 'http://www.xbrl.org/taxonomy/int/gl/muc/2003-08-29/';

    $entries = $dom -> getElementsByTagNameNS($glcor, 'accountingEntries');
    if (count($entries)) :
        foreach ($entries as $entry) :
            /*
             * entryHeader
             */
            $entryHeader = $entry -> getElementsByTagNameNS($glcor, 'entryHeader');
            if (count($entryHeader)) :
                foreach ($entryHeader as $header) :
                    $enteredDate = $header
                        -> getElementsByTagNameNS($glcor, 'enteredDate')
                        -> item(0)
                        -> nodeValue;
                    $enteredDate = trim($enteredDate);
                    $sourceJournalDescription = $header
                        -> getElementsByTagNameNS($glbus, 'sourceJournalDescription')
                        -> item(0)
                        -> nodeValue;
                    $sourceJournalDescription = trim($sourceJournalDescription);
                    $entryNumber = $header
                        -> getElementsByTagNameNS($glcor, 'entryNumber')
                        -> item(0)
                        -> nodeValue;
                    $entryNumber = trim($entryNumber);
                    /*
                     * INSERT TABLE
                     */
                    $sql = "INSERT INTO entryheaders(";
                    $sql .= "accountingEnrtiesID, enteredDate, sourceJournalDescription, entryNumber";
                    $sql .= ") ";
                    $sql .= "VALUES(";
                    $sql .= ":accountingEnrtiesID, :enteredDate,";
                    $sql .= ":sourceJournalDescription, :entryNumber";
                    $sql .= ") ";
                    $stmt = $pdo -> prepare($sql);
                    $stmt -> bindParam(':accountingEnrtiesID', $accountingEnrtiesID);
                    $stmt -> bindParam(':enteredDate', $enteredDate);
                    $stmt -> bindParam(':sourceJournalDescription', $sourceJournalDescription);
                    $stmt -> bindParam(':entryNumber', $entryNumber);
                    try {
                        $stmt -> execute();
                    } catch( PDOExecption $e ) {
                        print "Error!: ".$e->getMessage()."<br>";
                    }
                    // Get current sequence id value
                    $sql = "SELECT currval('entryheaders_id_seq') AS seq";
                    $stmt = $pdo -> query($sql);
                    while ($row = $stmt -> fetch(PDO::FETCH_ASSOC)) {
                        $entryHeadersID = $row['seq'];
                    }
                endforeach;
            endif;
        endforeach;
    endif;

[sql]テーブル定義


-- accountingEnrties
CREATE TABLE accountingEnrties (
    -- documentInfo
    id SERIAL8 NOT NULL,
    entriesType VARCHAR(32),
    uniqueID VARCHAR(32),
    language VARCHAR(32),
    creationDate  VARCHAR(10),
    creator  VARCHAR(64),
    entriesComment  VARCHAR(128),
    periodCoveredStart VARCHAR(10),
    periodCoveredEnd  VARCHAR(10),
    sourceApplication  VARCHAR(32),
    defaultCurrency  VARCHAR(32),
    -- entityInformation
    -- entityPhoneNumber 
    phoneNumber VARCHAR(16),
    -- entityFaxNumberStructure
    entityFaxNumber VARCHAR(16), 
    -- entityEmailAddressStructure 
    entityEmailAddress  VARCHAR(64),
    -- organizationIdentifiers 
    organizationIdentifier VARCHAR(16),
    organizationDescription VARCHAR(128),
    -- organizationAddress 
    organizationAddressStreet VARCHAR(128),
    organizationAddressCity VARCHAR(128), 
    organizationAddressStateOrProvince VARCHAR(128), 
    organizationAddressCountry VARCHAR(128),
    organizationAddressZipOrPostalCode VARCHAR(16), 
    PRIMARY KEY (id)
);

-- entryHeader
CREATE TABLE entryHeaders (
    id SERIAL8 NOT NULL,
    accountingEnrtiesID INT8,
    postedDate VARCHAR(10),
    enteredBy VARCHAR(32),
    enteredDate VARCHAR(10),
    sourceJournalID VARCHAR(16),
    sourceJournalDescription VARCHAR(128),
    entryOrigin VARCHAR(64),
    entryType VARCHAR(10),
    entryNumber VARCHAR(16),
    entryComment VARCHAR(16),
    bookTaxDifference VARCHAR(32),
    PRIMARY KEY (id),
    FOREIGN KEY (accountingEnrtiesID)  REFERENCES accountingEnrties ( id )
);

-- entryDetail
CREATE TABLE entryDetails (
    id SERIAL8 NOT NULL,
    entryHeadersID INT8,			
    lineNumber VARCHAR(16),
    -- account
    accountMainID VARCHAR(32),
    accountMainDescription VARCHAR(128),
    accountPurposeCode VARCHAR(16),
    accountType VARCHAR(32),
    -- accountSub
    accountSubDescription VARCHAR(128),
    accountSubID VARCHAR(32),
    accountSubType VARCHAR(32),
    amount VARCHAR(16),
    amountDecimals VARCHAR(16),
    amountUnitref  VARCHAR(16),
    amountMemo VARCHAR(128),
    -- identifierReference
    identifierCode VARCHAR(16),
    -- identifierExternalReference
    identifierAuthorityCode VARCHAR(16),
    identifierAuthority VARCHAR(64),
    identifierDescription VARCHAR(128),
    identifierType VARCHAR(32),
    -- identifierAddress
    identifierStreet VARCHAR(128),
    identifierCity VARCHAR(128),
    identifierStateOrProvince VARCHAR(128),
    identifierCountry VARCHAR(128),
    identifierZipOrPostalCode VARCHAR(16),
    documentType VARCHAR(16),
    documentNumber VARCHAR(16),
    documentReference VARCHAR(16),
    documentDate VARCHAR(10),
    documentLocation VARCHAR(64),
    maturityDate VARCHAR(10),
    terms VARCHAR(32),
    -- measurable
    measurableCode VARCHAR(16),
    measurableID VARCHAR(64),
    measurableDescription VARCHAR(128),
    measurableQuantity  VARCHAR(64),
    measurableUnitOfMeasure VARCHAR(16),
    measurableCostPerUnit  VARCHAR(64),
    measurableQualifier VARCHAR(16),
    -- depreciationMortgage
    dmJurisdiction VARCHAR(32),
    -- taxes
    taxAuthority  VARCHAR(16),
    taxAmount  VARCHAR(64),
    taxCode VARCHAR(16),
    debitCreditCode VARCHAR(16),
    postingDate VARCHAR(10),
    postingStatus VARCHAR(16),
    detailComment VARCHAR(128),
    PRIMARY KEY (id),
    FOREIGN KEY (entryHeadersID)  REFERENCES entryHeaders ( id )
);