お世話になっております。
チェッカーでは正しく“流動資産”という文字列を抽出できるのですが、php本体でうまくpreg_matchすることができません。
なお、HTMLは実際には.xbrlの拡張子で記載されるものの一部の抜粋になります。
なぜかチェッカーではうまく抽出はできます。
http://okumocchi.jp/php/re.php
どなたか、理由がお分かりの方
お力添えの程、宜しくお願い申しあえげます。
HTML
1sample.xbrl 2<span style="font-family: 'MS Mincho'; font-size: 12px">流動資産 3 </span> 4 </p> 5 6
php
1<?php 2 3$get=file_get_contents("sample.xbrl"); 4#echo($get); 5 6preg_match_all('/font-size: 12px">(.+?)<\/span>/s', $get, $matches); 7echo "<pre>"; 8print_r($matches); 9echo"</pre>";
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/27 05:35
回答8件
0
PHP マニュアルサイト内の"DOMElement::getAttribute"の項目で
php
1 $valueID = $searchNode->getAttribute('ID');
のコードが出ております。
関連メソッドとして
PHP
1 public DOMAttr getAttributeNode ( string $name ) 2 public DOMAttr getAttributeNodeNS ( string $namespaceURI , string $localName ) 3 public string getAttributeNS ( string $namespaceURI , string $localName )
も挙げられています。
私は以下の本を持っていますが、これは古本しかないようです。なお、DOMはjavaのサンプルが載っています。
XML逆引きクイックリファレンス―XML1.0(3rd Edition)対応 2006/7/1発行
坂田健二 著 毎日コミュニケーションズ刊
検証までおつきあいしませんで、ちょっと気が引けますが、そんなブレークスルーもプログラミングの醍醐味ですから、どうぞXMLおよびXBRLを極められますように。
投稿2017/01/05 09:26
編集2017/01/05 09:28総合スコア2285
0
投稿2017/01/04 13:16
総合スコア2285
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/04 13:55
2017/01/05 11:11 編集
2017/01/04 15:46
2017/01/04 15:47
2017/01/04 15:57
2017/01/04 23:33
2017/01/04 23:44
2017/01/05 08:20
0
もうひとつ補足として、私のXML習作集「XML研究の目次」と私の研究レポート「簿記の記帳と財務諸表作成へのXML技術の応用」を挙げておきます。
私は仕訳をXMLで表現できないか研究を始め、あとでXBRLのことを知ったので、記帳用のXBRL-GLの操作を中心に勉強してきました。一方、XBRL-FRの構造の単純さにちょっといなされた感じがしました。
SugiuraYさんも、自分なりの単純化したXBRLファイルを用意して、ダンプしたり、集計したりしてみるとXMLを操作する感覚が分かってくると思います。
投稿2017/01/04 08:43
編集2017/01/05 09:30総合スコア2285
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
SugiuraYさん、あけましておめでとうございます。
正月休み返上でDOMを研究なさったご様子で、頭が下がります。
私もRubyOnRailsの初歩をマスターするつもりでいながら、録り貯めたビデオの鑑賞で時を費やしてしまいました。
さて、XBRLのDOM操作ですが、まず勘定科目名のノードが< ></ >に挟まれているのではなく、
XBRL
1<jpfr-t-cte:CurrentAssets contextRef="CurrentQuarterConsolidatedInstant" unitRef="JPY" decimals="-6">123456000000</jpfr-t-cte:CurrentAssets>
のように名前空間の接頭語jpfr-t-cte:をつけて並んでいます。各勘定のノードが挟んでいるのは残高金額でタグ中の四半期の当期分の金額で有り、通貨"JPY"で、表示単位は百万円単位にくくることを示しています。
タグの深さはルート直下のxbrli:xbrlの子ノードに全ての情報がフラットに並べられています。
最初の方に並んでいるlink:schemaRefやlink:roleRefが外部のタクソノミ情報を宣言し、末尾の方でXLinkを作用させています。
参考になるかどうかいささか自信がありませんが、4年前にHTML&VBScriptでXBRLファイルを簡易解析するコードを作ったので以下にアップします。これが"MSXML2.DOMDocument"クラスが古いのか、IE11が相性が悪いのか、私のWindows8.1機では今動かすことができません。とりあえず、DOM操作の流れを概観してみて下さい。
HTML
1<html> 2<head> 3<title>XBRL-FR_ac_get_dom1</title> 4<script type="text/vbscript"> 5<!-- 6Option Explicit 7Sub onLord() 8End Sub 9 10Sub Syori() 11 dim xmldoc,fileValue,NodesEntryDetail,productPrice 12 dim ACMeiList,ACMeiNode,ACBan,i,karikei,kasikei 13 dim AEntryDetail,NumDetail,DCflg 14 dim ACCount,ACAmountList,ShortAC,XbrlFileMei 15 set xmldoc=CreateObject("MSXML2.DOMDocument") 16 xmldoc.async=False 17 xmldoc.setProperty "SelectionLanguage","XPath" 18 xmldoc.setProperty "SelectionNamespaces", " xmlns:jpfr-t-cte='http://info.edinet-fsa.go.jp/jp/fr/gaap/t/cte/2011-03-14' xmlns:jpfr-t-sec='http://info.edinet-fsa.go.jp/jp/fr/gaap/t/sec/2011-03-14' xmlns:link='http://www.xbrl.org/2003/linkbase' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:jpfr-oe='http://info.edinet-fsa.go.jp/jp/fr/gaap/o/oe/2011-03-14' xmlns:jpfr-di='http://info.edinet-fsa.go.jp/jp/fr/gaap/o/di/2011-03-14' xmlns:xbrli='http://www.xbrl.org/2003/instance' " 19 XbrlFileMei=MyForm.XbrlFRFile1.value 20 fileValue=xmldoc.load(XbrlFileMei) 21 If fileValue=False Then 22 MsgBox "XBRL-FR ファイル 読み込みエラー" 23 End If 24 25 ACMeiList="" 26 set ACMeiNode=xmldoc.getElementsByTagName("./xbrli:xbrl/*") 27' set ACMeiNode=xmldoc.getElementsByTagName("./xbrli:xbrl/[contains(.,'jpfr-t-cte:')]") 28' set ACMeiNode=xmldoc.selectNodes("./xbrli:xbrl/") 29 30 31 ACCount=0 32 If ACMeiNode.length>0 Then 33 For i=0 to ACMeiNode.length-1 34 If InStr(ACMeiNode(i).nodeName, "jpfr-t-cte:") Then 35 ShortAC = Replace(ACMeiNode(i).nodeName, "jpfr-t-cte:" ,"") 36 ACMeiList=ACMeiList & ShortAC & vbCrLf 37 ACCount=ACCount+1 38 End If 39 Next 40 End If 41 myForm.showArea1.value=ACMeiList 42 msgbox "勘定科目出現回数:" & ACCount 43 44 ACAmountList="<table border='1'><tr align='center'><th bgcolor='#FFFFCC'>勘定科目</th><th bgcolor='#CCFF66'>金額</th>Amount<tr>" & vbCrLf 45 If ACMeiNode.length>0 Then 46 For i=0 to ACMeiNode.length-1 47 If InStr(ACMeiNode(i).nodeName, "jpfr-t-cte:") AND InStr(ACMeiList, ACMeiNode(i).Text)=0 Then 48 ShortAC = Replace(ACMeiNode(i).nodeName, "jpfr-t-cte:" ,"") 49 ACAmountList = ACAmountList & "<tr><td bgcolor='#FFCCFF'>" & ShortAC & "</td><td bgcolor='#CCFF66' align='right'>" & FormatNumber(ACMeiNode(i).Text,,,,-1) & "</td></tr>" & vbCrLf 50 End If 51 Next 52 End If 53 ACAmountList= ACAmountList & "</table>" 54 document.getElementByID("showArea2").innerHTML = ACAmountList 55End Sub 56 57Sub XbrlFRFile1_onChange() 58 Syori() 59End Sub 60--> 61</script> 62</head> 63<body bgcolor="#66CCFF"> 64<br> 65<h1 align="center">EDI-NetのXBRL-FRファイルの勘定科目データ簡易抽出ページ</h1> 66 67 <form name="myForm"> 68 <p> 69 勘定科目(Account)を抽出したいXBRL-FRファイルのパス <br /> 70 <input id="XbrlFRFile1" type="file" size="160" /></p> 71 <p> 72勘定科目リスト<br> 73 <textarea name="showArea1" cols="60" rows="15" Readonly="true"></textarea><br> 74<br> 75 </form> 76XBRL FR 勘定残高リスト (複数あるのは前期分と当期分を示している)<br> 77 <div id="showArea2"></div> 78</body> 79</html>
これは確かに4年前のウインドウズ7機では動きました。
また、英語勘定科目名と日本語勘定科目名を並べたAccountListcsvファイルを線形探索して和訳して一覧表示するXBRL-FR_ac_get_dom4.htmも開発しました。
AccountList.csv
1科目名[en:label],Account classes,科目名[ja:label],name,balance,periodType 2Non-current assets,,非流動資産,NoncurrentAssetsAbstract,,duration 3Cash and cash equivalents,Assets,現金及び現金同等物,CashAndCashEquivalents,debit,instant 4Current assets,Assets,流動資産,CurrentAssets,debit,instant 5Assets,Assets,資産,Assets,debit,instant 6Liabilities,,負債,LiabilitiesAbstract,,duration 7Equity,Equities,資本,Equity,credit,instant 8 : 9 : 10
また、XBRLの技術について詳しい書籍として
XML技術とXBRLデータ標準を用いたインターネット財務情報システム」湯浦克彦著 ソフトリサーチセンター刊
をお勧めします。もう古本でしか手に入らないのではないかと思い、アマゾンで検索してみるとまだ発行されていて少し驚きました。タクソノミやスキーマやXML操作技法が出ていてかなり参考になります。
今、ご提供できる手掛かりはこの程度です。では、本年がよい年になりますように。
投稿2017/01/04 08:24
総合スコア2285
0
EDINET上のXBRL-FRのデータファイルには、日本語の勘定科目は振られていないので、CurrentAssetsで検索するとその金額なり、目的の会計期間なりが検索できます。
日本語の勘定科目名はXLinkのしくみで対応表からもってくるようになっています。XLinkについては残念ながら具体的には私も理解できていません。
ただ、XBRLはXMLファイルなので、XMLオブジェクトとして定義してDOMの操作をするのが、スマートです。
VBScriptでの私の習作の一部ですが、以下のコード例がXMLデータをDOM操作するコードの例です。
HTML内のVBScriptでのXML
1 set xmldoc=CreateObject("MSXML2.DOMDocument") 2 xmldoc.async=False 3 xmldoc.setProperty "SelectionLanguage","XPath" 4 xmldoc.setProperty "SelectionNamespaces", " xmlns:jpfr-t-cte='http://info.edinet-fsa.go.jp/jp/fr/gaap/t/cte/2011-03-14' xmlns:jpfr-t-sec='http://info.edinet-fsa.go.jp/jp/fr/gaap/t/sec/2011-03-14' xmlns:link='http://www.xbrl.org/2003/linkbase' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:jpfr-oe='http://info.edinet-fsa.go.jp/jp/fr/gaap/o/oe/2011-03-14' xmlns:jpfr-di='http://info.edinet-fsa.go.jp/jp/fr/gaap/o/di/2011-03-14' xmlns:xbrli='http://www.xbrl.org/2003/instance' " 5 XbrlFileMei=MyForm.XbrlFRFile1.value 6 fileValue=xmldoc.load(XbrlFileMei) 7 set ACMeiNode=xmldoc.getElementsByTagName("./xbrli:xbrl/*")
phpならば、
PHP
1 $dom = new DOMDocument('1.0', 'UTF-8'); 2 $dom->preserveWhiteSpace = false; 3 $dom->formatOutput = true; 4 $dom->load("sample.xbrl"); 5 $root = $dom->getElementsByTagName("xbrli:xbrl")->item(0); 6 $sampleNode = $root->getElementsByTagName("jpfr-t-cte:CurrentAssets")->item(0); 7 echo $sampleNode->nodeValue;
のような形式で金額を抜き出すのでしょう。上記のコード内の"jpfr-t-cte:勘定科目名"の記述は、jpfr-t-cteというネーム空間での規則でXMLファイルを操作しているという印です。ただ、一つのxbrlファイルの中に前期や四半期などの複数の会計期間の金額が入っていることがあるので、会計期間の属性(contextRef)を絞らなければならないでしょう。
検証を省略したアドバイスで恐縮ですが、参考になれば幸いです。
投稿2016/12/27 09:22
編集2016/12/27 09:26総合スコア2285
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/27 23:33
2016/12/28 08:41
2016/12/28 10:07
2017/01/04 04:13
0
ファイルそのものからは抽出ができませんでした。ファイルの種類の問題なのでしょうか
???
私はあなたが示したHTMLを「sample.xbrl」というファイル名で保存してテストし、正常に動作しましたよ。
実際には「sample.xbrl」の中身はもっと大きいのですか?
それならその「sample.xbrl」自体をアップするか、中身を全部(サイズが大きすぎるなら一部でもいいからもうちょっと長い範囲で)投稿してください。
また、motuoさんの指摘した通り、全ての文字コードが統一されているかをチェックしたほうがいいですね。
sample.xbrlとphpファイル自体のエンコーディングが「utf-8」になっているかどうかを確認し、さらにphpスクリプトの先頭(開始タグの次の行)に
php
1mb_language("ja"); 2mb_internal_encoding("UTF-8");
を入れてみてください。
投稿2016/12/27 06:45
編集2016/12/27 06:51総合スコア907
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/27 08:16
2016/12/27 08:28
2016/12/27 09:54
2016/12/27 12:22
0
ベストアンサー
提示されているソースをそのままテストしてみたら、正常に動作しましたよ。
Array
(
[0] => Array
(
[0] => font-size: 12px">流動資産
)
[1] => Array
(
[0] => 流動資産
)
)
投稿2016/12/27 04:42
編集2016/12/27 04:44総合スコア907
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
var_dump($get)等で$getの内容を確認してみては如何でしょうか?もしかしたら、意図しない文字列が入っていたりしませんか?
投稿2016/12/27 04:41
総合スコア3027
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/27 05:34
2016/12/27 05:42
2016/12/27 08:17
2016/12/27 08:28
2016/12/27 08:41
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。