この連載の読む順番
TDnet①〜④で、書類の役割からXBRLの解析・グラフ化までを順に扱います。その後、EDINET①〜④へ進みます。共通の基本操作はTDnet編を参照し、EDINET編では違いを確認します。
- TDnet解析① TDnetとは?決算短信・適時開示とEDINETの違い
- TDnet解析② XBRLとは?決算短信のPDFと数値データを図解
- TDnet解析③ XBRLの値を比較する前に、期間・単位・欠損を確かめる
- TDnet解析④ 累計と四半期単独、実績と予想を分けてグラフにする
- EDINET解析① EDINETとは?有価証券報告書から企業を理解する
- EDINET解析② XBRLとは?有価証券報告書の構造とタグの仕組みを理解する
- EDINET解析③ TDnetの次に読むXBRL――ファイル・タグ・コンテキストの違いを確かめる(この記事)
- EDINET解析④ 財務データを継続的な分析に使う
TDnet編とEDINET①・②の説明を踏まえ、今回はEDINETの公式サンプルを読みます。TDnet③で確認した「条件で値を選び、参照先で期間と単位を確かめる」という手順を使い、どこを読み替える必要があるかを見ていきましょう。
前提となる記事:TDnet解析③。候補の選び方、ゼロと欠損、Python・仮想環境の準備、XPathと名前空間の基本は、そちらで説明しています。初めて読む方は先にTDnetの実習を終えてから戻ると、以下の違いを追いやすくなります。
EDINETの書類構造自体を確認したい場合は、EDINET解析②も参照してください。
今回は何が変わるのか
比較するのは、TDnet③で読んだTDnetのInline XBRLと、今回選んだEDINETの.xbrlです。EDINETにもInline XBRLがあり、TDnetとEDINETを形式だけで二分する表ではありません。
| 確認箇所 | TDnet③のサンプル | 今回読むEDINETサンプル |
|---|---|---|
| 対象ファイル | 決算短信の-ixbrl.htm
|
PublicDoc内の.xbrl
|
| 売上高の位置 |
ix:nonFractionのname属性 |
jppfs_cor:NetSales要素 |
| コンテキスト | 連結・実績のメンバーを持つ例 | 今回選ぶ当期のcontextにはscenarioがない |
| 数値の読取り | 表示文字にscale等を適用 |
要素の中の数値を読む。scaleを掛け直さない |
| 共通する確認 | 期間・範囲・単位・候補数を確認 | 同じ確認を続ける |
使うのは2026年版EDINETタクソノミの公式サンプルです。数値は説明用データで、実在企業の業績ではありません。確認日は2026年10月26日です。目標は、指定したサンプルの売上高323609000000が、2025年4月1日から2026年3月31日までの期間に対応する円単位の値だと説明できることです。
1. サンプルの中で、どのファイルを開くか
金融庁の2026年版EDINETタクソノミ公表ページから「サンプルインスタンス」を取得します。「タクソノミ本体」とは別の配布物です。タクソノミは項目の定義、サンプルインスタンスはその定義を使った報告内容の例です。
出典:金融庁「2026年版EDINETタクソノミの公表」、公表資料(1)(h)。2026年10月26日撮影。画像の左側にある「サンプルインスタンス(ZIP)」が今回の取得先です。右側の概要説明PDFや、上の「タクソノミ本体」と区別します。
ダウンロードしたZIPを、練習用フォルダーに edinet-official-sample.zip という名前で保存します。コードはZIPを直接読むので、展開しなくても動きます。手で中身を確かめる場合は、別途展開して構いません。
この回の対象は、XBRL/PublicDoc/ に入っている次のファイルです。
jpcrp030000-asr-001_X99001-000_2026-03-31_01_2026-06-12.xbrl
ファイル名に似た文字が並んでいても、拡張子まで確認します。.xbrl と _ixbrl.htm は、この練習では入れ替えて使いません。
| 見つかるファイル | この回での読み方 |
|---|---|
.xbrl |
値とコンテキスト、単位を読む対象 |
_ixbrl.htm |
人が読む表示にタグを埋め込んだInline XBRL |
.xsd |
項目や参照先を定義するスキーマ |
_pre.xml |
表示上の親子関係や順序を記した表示リンク |
PublicDoc は提出本文側、AuditDoc は監査報告書側のデータを探す際の区別になります。今回はファイル名に加えて /PublicDoc/ という場所も確認します。別の場所にある似たファイルを、黙って採用しないためです。
ZIP内の日本語フォルダー名が環境によって読みづらく表示される場合があります。この例では、ASCIIで書かれた末尾のパスを使って対象を特定します。文字化けした名前を新しい正しい名称として扱ったり、元のZIPを書き換えたりする必要はありません。
2. name属性ではなく、項目の要素を探す
TDnet③では、ix:nonFractionのname="tse-ed-t:NetSales"を探しました。今回の.xbrlでは、売上高そのものが次の要素です。改行を追加し、今回使わないid属性を省いています。
<jppfs_cor:NetSales
contextRef="CurrentYearDuration"
unitRef="JPY"
decimals="-6">323609000000</jppfs_cor:NetSales>
したがって、前のXPathをそのまま使うのではなく、./p:NetSales[@contextRef=$c]へ変更します。pは、このコードで財務諸表本表タクソノミの名前空間URIに割り当てる接頭辞です。
http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2025-11-01/jppfs_cor
ここで確認するのは元ファイルが参照しているURIです。2026年版という配布名を見て、URIの日付を独自に2026年へ書き換えないでください。別の版へ進むときは、そのファイルの名前空間宣言とタクソノミを確認します。接頭辞とURIの役割は、TDnet③の「コードは、何をどの順番でしている?」で扱った考え方と同じです。
3. 連結・個別の表し方を読み替える
今回のファイルで同じ売上高要素を探すと16件あります。TDnetで学んだ候補の絞り方を使いますが、コンテキストIDや軸の設定をそのままコピーすることはできません。一部を抜粋すると、次の違いがあります。
| コンテキストID | 値(円) | 今回確認する違い |
|---|---|---|
Prior1YearDuration |
316,934,000,000 | 前年の期間 |
CurrentYearDuration |
323,609,000,000 | 今回選ぶ当年の期間 |
CurrentYearDuration_NonConsolidatedMember |
210,346,000,000 | 当年の個別 |
TDnetのサンプルでは、ConsolidatedMemberとResultMemberを含むコンテキストを使いました。今回はCurrentYearDurationをたどり、period内の開始日2025-04-01と終了日2026-03-31を確認します。主体を示すentity/identifierはX99001-000です。
このコンテキストには scenario がありません。EDINET解析②で扱った設定例では、個別側に NonConsolidatedMember を指定する形と区別しました。ただし、scenarioがないことだけで、あらゆるXBRLの連結・実績を断定しないようにします。該当タクソノミ、対象の表、ディメンションのデフォルトなどとの関係があります。今回は確認済みのサンプルに対象を限定しています。報告書インスタンス作成ガイドライン
出典:金融庁「報告書インスタンス作成ガイドライン」p.40(PDF 50ページ目)の抜粋。上の表の period/startDate と period/endDate が、今回読む開始日と終了日に対応します。下の表は個別・時点の設定例であり、今回の売上高にそのまま当てはめるものではありません。
4. TDnetのscale計算を、そのまま移さない
unitRefからユニットをたどる手順はTDnet③と同じです。今回も参照先のmeasureはiso4217:JPYなので円ですが、値の取り出し方は変わります。
| 読取りの段階 | TDnetのInline XBRLの例 | 今回のEDINET .xbrlの例 |
|---|---|---|
| 元の文字 | 1 |
323609000000 |
| 円単位への解釈 |
scale="6"を使い1 × 10⁶
|
要素の数値をそのまま読む |
| 得られる円単位の値 | 1000000 |
323609000000 |
| 百万円表示にする | 円単位の値を100万で割る | 同じく100万で割る |
二つは別のサンプルの数値です。同じ企業・同じ業績を二通りに表現した比較ではありません。
decimals="-6"は百万の位までの精度に関する情報で、100万倍する指示ではないことも、TDnetで確認した通りです。今回の.xbrlの値へ掛け直すと、既に円単位の数値をさらに100万倍してしまいます。XBRL 2.1仕様
図:今回新しく確認するのは、.xbrlから読んだ値にInline XBRL用の桁調整を掛け直さないことです。
5. TDnetで使ったPython環境で実行する
TDnet③で用意したPython 3とlxmlの環境をそのまま使います。仮想環境やライブラリをまだ用意していなければ、TDnet③の「実行前に用意するもの」を先に進めてください。
練習用フォルダーへedinet-official-sample.zipを追加し、下のコードをread_edinet_sample.pyとして保存します。TDnet用のZIPとスクリプトは別名のまま残せます。macOS・Linuxでは次のコマンドで実行します。
.venv/bin/python read_edinet_sample.py
WindowsのPowerShellでは次を使います。
.\.venv\Scripts\python.exe read_edinet_sample.py
変更点を含む実行用コード
コピーして試せるよう、コードは一つにまとめています。ZIPの読取り、候補数の確認、参照先をたどる部分はTDnet③と共通です。今回変わる中心は、対象パス、名前空間と要素の選択、想定するコンテキスト、数値の変換です。特定のサンプルだけを扱い、想定と違う入力では止まる例です。
"""One known fact from the FSA 2026 taxonomy sample; not a general XBRL parser."""
import json
import sys
from decimal import Decimal
from zipfile import ZipFile
from lxml import etree
FILENAME = "jpcrp030000-asr-001_X99001-000_2026-03-31_01_2026-06-12.xbrl"
NS = {
"x": "http://www.xbrl.org/2003/instance",
"p": "http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2025-11-01/jppfs_cor",
"xsi": "http://www.w3.org/2001/XMLSchema-instance",
}
def exactly_one(items, label):
if len(items) != 1:
raise ValueError(f"{label}: expected 1, got {len(items)}")
return items[0]
def read_sample(path):
with ZipFile(path) as archive:
member = exactly_one(
[n for n in archive.namelist() if n.endswith("/PublicDoc/" + FILENAME)],
"sample file",
)
root = etree.fromstring(
archive.read(member),
parser=etree.XMLParser(resolve_entities=False, no_network=True),
)
context_id = "CurrentYearDuration"
fact = exactly_one(root.xpath(
"./p:NetSales[@contextRef=$c]", namespaces=NS, c=context_id
), "NetSales")
context = exactly_one(root.xpath(
"./x:context[@id=$c]", namespaces=NS, c=fact.get("contextRef")
), "context")
unit = exactly_one(root.xpath(
"./x:unit[@id=$u]", namespaces=NS, u=fact.get("unitRef")
), "unit")
if fact.get("{" + NS["xsi"] + "}nil") in {"true", "1"}:
raise ValueError("The selected fact is nil")
if context.find("x:scenario", NS) is not None or context.find("x:entity/x:segment", NS) is not None:
raise ValueError("This example expects a context without scenario/segment")
if len(unit) != 1 or unit[0].tag != "{" + NS["x"] + "}measure":
raise ValueError("This example expects a simple currency unit")
measure = (unit[0].text or "").strip()
prefix, local = measure.split(":", 1)
if unit[0].nsmap.get(prefix) != "http://www.xbrl.org/2003/iso4217" or local != "JPY":
raise ValueError("This example expects JPY")
start = context.findtext("x:period/x:startDate", namespaces=NS)
end = context.findtext("x:period/x:endDate", namespaces=NS)
if (start, end) != ("2025-04-01", "2026-03-31"):
raise ValueError("Unexpected reporting period")
value = Decimal((fact.text or "").strip())
return {
"element": "jppfs_cor:NetSales",
"entity": context.findtext("x:entity/x:identifier", namespaces=NS),
"contextId": context_id,
"startDate": start,
"endDate": end,
"unit": local,
"value": str(value),
"decimals": fact.get("decimals"),
"displayMillionYen": str(value / Decimal("1000000")),
}
if __name__ == "__main__":
path = sys.argv[1] if len(sys.argv) > 1 else "edinet-official-sample.zip"
print(json.dumps(read_sample(path), ensure_ascii=False, indent=2))
TDnetのコードから変わる箇所
| 今回のコード | 変更する理由 |
|---|---|
endswith("/PublicDoc/" + FILENAME) |
提出本文側の指定ファイルを選ぶ |
NS["p"]と./p:NetSales
|
項目の名前空間と要素名で探す |
scenario/segmentを確認 |
今回選んだ、これらを持たない既知のcontextと一致するかを確かめる |
Decimal((fact.text or "").strip()) |
.xbrlの数値を読み、scaleを掛けない |
exactly_oneは、TDnet③の「一件だけかを確認してから取り出す」処理を関数にしたものです。複数候補を一般的に解決する規則を追加したものではありません。連結の判定も汎用化していません。
6. 今回のサンプルの出力を照合する
出力は次のとおりです。ZENITH CodeのAPI応答ではなく、この練習用の独自形式です。
{
"element": "jppfs_cor:NetSales",
"entity": "X99001-000",
"contextId": "CurrentYearDuration",
"startDate": "2025-04-01",
"endDate": "2026-03-31",
"unit": "JPY",
"value": "323609000000",
"decimals": "-6",
"displayMillionYen": "323609"
}
valueは元の要素の数値、startDateとendDateはコンテキストの期間、unitはユニットの定義と照合します。確認の順序はTDnet③と同じです。今回追加で確かめたいのは、displayMillionYenの323609を100万倍するとvalueへ戻り、value自体には倍率を掛け直していないことです。
valueを文字列で出しているのは、Decimalで扱った十進数の表現を残すためです。今回の対象表を人が確認したことと、コードが自動で確認する条件は区別してください。
7. EDINETのファイルへ替えたときに止まったら
ZIPの保存場所やlxmlのインストールに関する基本的なエラーは、TDnet③の「動かなかったときに確認する場所」を参照してください。ここでは入力を替えたことで起こる違いに絞ります。
| 表示 | この回で確認するところ |
|---|---|
sample file: expected 1, got 0 |
2026年版のサンプルか。PublicDoc内に指定した.xbrlがあるか |
NetSales: expected 1, got 0 |
Inline XBRL用の検索式を使っていないか。URI・要素・contextが一致するか |
Unexpected reporting period |
指定したcontextの実際の日付が今回の想定と合うか |
This example expects a context without scenario/segment |
個別やセグメントのcontextに替わっていないか。このコードの対象範囲か |
確認行を削除するのではなく、どの前提が変わったかを調べます。別年度へ拡張する場合は、日付やファイル名だけでなく、参照する定義も読み直します。
8. このコードで行っていないこと
今回は対象を小さく固定しました。ほかの会社や年度への展開では、さらに確認が必要です。
- IFRSや提出者独自のタグを、同じ意味の項目へ対応付けること。
- ディメンションやデフォルトを含む一般的な連結・個別の判断。
- 表示リンクをたどって財務諸表の階層を組み立てること。
- 円/株などの複合単位、Inline XBRLの変換規則、文章の連結。
- 訂正・取下げ、同一条件の複数候補、書類間の採用順の決定。
- タクソノミ全体の読込みや、XBRL仕様への完全な妥当性検証。
no_network=True は、今回のXML読取りで外部への参照を読み込ませない指定です。未信頼の巨大ZIPやXML全般に対応する安全な解析基盤が、これだけで完成するわけではありません。今回扱うのは金融庁から取得した既知の学習用ファイルです。
確認問題: TDnetで使ったDecimal(文字列) * 10 ** scaleを、今回の.xbrlにもそのまま移してよいでしょうか。
今回は移しません。今回の要素には既に円単位の数値が記録されています。decimalsをscaleの代わりに使うこともできません。提供元の名前だけで処理を切り替えるのではなく、実際に読む形式と属性を確認します。
自分の分析へ進むには
今回のように値の意味を確認する手順は、構造化済みのデータをAPIで取得するときにも使います。自分で項目や表示方法を選びたい場合は、必要な情報の粒度を先に決めましょう。主要項目の推移、表の階層、個々のXBRL要素では、読むデータの形が違います。
私たち株式会社Crabgrassは、財務データAPI「ZENITH Code」を開発・提供しています。標準化された主要項目に加え、有価証券報告書のXBRL数値データの利用方法も案内しています。
目的に合わせて、次の資料を選ぶ
今回確認した内容をサービス内のガイドにも整理しました。疑問に近い入口から読み進められます。
- EDINET解析ガイド:書類の識別、タグ、表示階層、タクソノミの管理を一通り確認する。
- 財務データAPIの選び方:主要項目の推移、表の階層、個々のXBRLファクトのどれが必要かを決める。
- TDnet解析ガイド:決算短信を扱う際の実績・予想、期間、単位、訂正の確認順を読む。
関連記事:TDnet解析②:PDFと数値データ / EDINET解析②:構造とタグ
本記事は公式サンプルを用いた技術解説です。特定の金融商品の売買を勧めるものではありません。


