2013年9月18日水曜日

XMLがわからん

タイトルのとおりです。

                〈 ̄ヽ 
            ,、____|  |____,、
           〈  _________  ヽ,
           | |          | |
           ヽ' 〈^ー―――^ 〉 |/ 
              ,、二二二二二_、 
             〈__  _  __〉
                | | |  | 
                / / | |   |\ 
            ___/ /  | |___| ヽ 
            \ __/   ヽ_____)



…いえ、ウソです。真面目にやります。


政府系公共機関には、オンラインの場合XML形式で提出しなさい、という仕様の書類が幾らかあるようなんですね。

昨年辺りから扱う係になったんですが、なんせソフトがテキトーで、と言うかウチ独自仕様にカスタムし過ぎたものだそうで、扱えることは扱えるんだけど「修正するときは生データになります」というネ申仕様。なんだそれ。

で、更にひどいことに、一般団体にも同じデータを扱うトコがあるんですが、そこは国が定めた仕様を無視して「CSVで」とか更には「桁指定テキストで」とかいうんですね。いつの時代だよ!と言いたいところなんですが、冒頭のとおり、実は助かってしまうのであまり強くも言えないと来ている。

しかしまあそんなのはString型融通利きすぎワロタおじさんとしては心底どうでもいいんです。問題はね、その団体の一つが「あ、請求書要りません、代行請求しますんで任せてくださいw おたくに直接振り込みしてもらうんでーwww」な事なんです。

普通に企業勤めしてれば請求書の大切さって分かりますよね?自分トコの売上、ひいては企業活動の根拠となるものですよあーた。こちらとしても出さしてくれなきゃマトモに上司に報告もできねえっつうのホント。

でも他の取引先はその仕様でやってるし、ウチももう契約しちゃってるし…という話でありまして、あとは内訳書を強引にでっち上げて先方に送りつけないと私の責任問題という事になっちまうわけです。やったね!

で、提出の必要がないとはいえ国が定めた仕様で集計する事るんですが、これがまたそのXML形式のイヤらしいところで、請求書はオンライン提出時に内訳表とか明細書として生成されるため業務ソフトにはそういう機能が一切ない。だから結局XML生データをいじるしかないという。トホホ。

で、XMLについてググってみたりして、多少XSLTだとか知ったんですが、やってみても一向にうまく表示が出来ず、ハマってしまいました。で、唸りながら改めてソース眺めてたらアナタ、要素内にデータがない。えええええ?空タグってこと?でもオンラインで提出した時のデータ、表形式で印刷できるよ?どうなってんの?→タグ内に数値がある!なんだこの仕様!!どこググってもそんなのの表示の仕方出てこないんですけどwwww

もうここで真顔ですよ。もうタグごとString型で読み込んで切り出しますよいいですよーだ!小学生状態ですよ。締め切り日迫ってますし。


幸い、タグの名前は決まってますので文字数を調べて「"(ダブルコーテーション)」のバイト位置あたりで切り出して整形すれば良い、ということで力技の対処をいたしました。勿論Excelマクロ(VBA)です。ソース書くのもアレなので一応処理の内容だけ最後に書きますが、まぁなんというかね。こんなもん本当にXML化する必要あったのかなとか。そういう風に思わざるを得ないですねもう。統計をとったりする方には便利なのかも知れませんが、生データも所謂Content部分でなく空タグの中身にデータが入ってるとか一般的に使いやすい仕様なのかそれ。個人情報が絡むからわざと汎用性を落としてるっていうことなんでしょうかねぇ…よくわかりません。

でもこれもXMLの仕様に沿った利用方法である可能性もありますので、反論するため(いや、できたからと言ってどうにもならないんですけど)にも、もっと基礎から勉強しようと思いました。できるかわかんないけど。勉強してわかったことがあれば報告します…いつになるかわかんないけど…



(以下、一応処理の流れですが見たからって言ってどうという事もないと思いますので自己満ってことで追記に隠しときますね)




FileSystemObject使用して対象フォルダをツリー選択〜パスを取得

FSO内すべてのファイルにたいし条件検査(IF式)

対象ファイルが見つかったらOPEN #〜Line Inputで行データ取得(お約束の流れ)

タグ条件検索(IF式;文字列検査)

別に設定したタグ別切り出し処理(Select Case)

配列に格納

条件検査でワークシートの名前付き範囲を対象Rangeとしてセット

対象Rangeに配列を掃き出し


これだけです。結局Stringおじさんなのだった。チャンチャン。

0 件のコメント:

コメントを投稿