XML - みる会図書館


検索対象: Shell Script ライトクックブック
17件見つかりました。

1. Shell Script ライトクックブック

レシピ 3.7 XML 、 HTML ファイルを読み込む だから、正規化だけをやるようなコマンドであってほしかった。 ■理由 2. フィルターとして振る舞うようになりきれてない 同じく教義の一つに 9. 全てのプログラムはフィルターとして振る舞うように作れ。 59 というものがある。フィルターとは、入力されたものに何らかの加工を施して出力するものをいうが、 jq や xmllint 等は、出力の部分に注目するとフィルターと呼ぶには心もとない気がする。 なぜなら、これらのプログラムはどれも JSON や XML 形式のまま出力される。しかし、他の標準 UNIX コマンドからは扱いづらい。 AWK,sed,grep,sort,head,tail ・ ・・・などなど、標準 UNIX コマンドの多くは、行 単位あるいは列単位 ( 空白区切り ) のデータを加工するのに向いた仕様になっているため、 JSON や XML 形式 のままだと結局扱いづらい。 だから、行や列の形に正規化するコマンドであってほしかった。 無いものは作る。シェルスクリプトとパイプを駆使して。 そうして作ったパーサーが、このレシピやそしてこの後のレシピ 3.7 で紹介したものだ。 GitHub に置いてあ るソースコード * 8 を見れば明白だが、これらのパーサーもまた、シェルスクリプトを用い、 AWK 、 sed 、 grep 、 tr 等をパイプで繋ぐだけで実装した。 これまた UN Ⅸ哲学の教義だが、 6. ソフトウェアは「てこ」。最小の労力で最大の効果を得よ。 7. 効率と移植性を高めるため、シェルスクリプトを活用せよ。 というのがある。その教義に従って実際に作ってみると、シェルスクリプトや UNIX コマンド、パイプという ものがいかに偉大な発明であるか思い知らされた。 無ければ自分で作る。由緒正しい UNIX の教本にも、「置いてあるコマンドは見本みたいなものだから、無い ものは自分達で作りなさい」と書かれているそうだ。それに、自分で作れば、対象概念の理解促進にもつながる。 * 8 https : //github ・ com/SheIIShoccar-jpn/Parsrs もしそれができたら、 HTML のスクレイピングもできるようになるのだろうか。 り XML もできるんでしよ ? WebAPI を叩いて得られた XML ファイルの任意の箇所の値を読み出したい。 CSV 、 JSON と来たらやつば 問題 レシピ 3.7 XML 、 HTML ファイルを読み込む →レシピ 3.7 (XML 、 HTML ファイルを読み込む ) →レシピ 3.5 (CSV ファイルを読み込む )

2. Shell Script ライトクックブック

60 回答 第 3 章 POSIX 原理主義テクニック XML ももちろん可能だ。 sed や AWK を駆使すれば、やはり POSIX の範囲でパーサーが作れる。ただ、 HTML のスクレイピングに流用できることはあまり期待しない方がいい。理由は、 HTML は閉じタグが無い など文法が間違っていても Web プラウザーが許容するおかげでそのままになっているものがあるし、更には < br > など、閉じタグが無いことが文法的にも認められているものがあり、そういった XML 的に文法違反のも さて解説は後回しにして、制作した XML パーサー "parsrx. sh ”をダウンロード * 9 して使ってもらいたい。 のには通用しないからだ。 例えば、次のような XML ファイル (sample. xml) があったとする。 く文具購入リスト会員名 = " 文具太郎 " > く購入品 > はさみく / 購入品 > く購入品 > ノート (A4, 無地 ) く / 購入品 > く購入品 > シャープペンシルく / 購入品 > く購入品 > く取寄商品 > 替え芯く / 取寄商品 > く / 購入品 > く購入品 > クリアファイルく / 購入品 > く購入品 > く取寄商品 > 6 穴パンチく / 取寄商品 > く / 購入品 > く / 文具購入リスト > これを次のようにして parsrx. sh に掛けると、第 1 列 : 元の値のあった場所 (XPath 形式 (0) 、第 2 列 : 値、 と いう 2 つの列から構成されるテキストデータに変換される。 $ . /parsrx. sh sample. xml ロ / 文具購入リスト/@会員名文具太郎 / 文具購入リスト / 購入品はさみ / 文具購入リスト / 購入品ノート (A4, 無地 ) / 文具購入リスト / 購入品シャープペンシル / 文具購入リスト / 購入品 / 取寄商品替え芯 / 文具購入リスト / 購入品 / 文具購入リスト / 購入品クリアファイル / 文具購入リスト / 購入品 / 取寄商品 6 穴パンチ / 文具購入リスト / 購入品 / 文具購入リスト \ Ⅱ *n *n \ Ⅱ *n *n \ Ⅱ よって、後ろにパイプ越しにコマンドを繋げば「任意の場所の値を取得」ができる。例えば次のような具合だ。 である。詳細は http : //www.w3.org/TR/xpath-31/参照。 * IOXML データは階層構造になっているので、同様に階層構造をとるファイルバスのようにして一行で書き表せる。その記法が XPath & ペーストしてもよいし、あるいは "RAW ”と書かれているリンク先を「名前を付けて保存」してもよい。 * 9 https://github.com/She11Shoccar-jpn/Parsrs/b10b/master/parsrx.sh にアクセスし、そこにあるソースコードをコピー

3. Shell Script ライトクックブック

レシピ 4.6 Ajax で画面更新したい 理解し、コピー & ペーストして使う方がよっぽど簡単ではなかろうか。 前述の JavaScript コードは XMLHttpRequest という Ajax のためのオプジェクトを使うためのコードだが、 いくつかのポイントを押さえれば理解は簡単だ。 ポイント 1. XMLHttpRequest オプジェクト生成方法 79 ただし困ったことに IE8 は、く select > タグにはⅲ nerHTML プロバティー代入ができないというバグがあ する ) で紹介している便利な mojihame コマンドを使えば、それほど大変なことにはならないのだ。 なる。そのぶんサーバー側が大変になると思うかもしれないが、レシピ 4.8 ( HT L テープルを簡単綺麗に生成 リー無しの JavaScript 側で、苦労して HTML の DOM ツリーを操作するなどといった面倒な作業が要らなく に代入するだけで済んでしまう。このようにしてサーバー側に部分 HTML の生成を任せてしまえば、ライプラ HTML ごと作ってしまっている。 こうすると JavaScript 側は受け取った文字列を innerHTML プロバティー 時刻データを XML や JSON で表現したものを返しているのではなく、ハメ込まれるく div> タグの中身の部分 といって、最近 XML の代わりに使われるようになってきた JSON も利用していない。サーバー側の CGI は このサンプルコードのもうーっの特徴は、 Ajax でありながら XML をやりとりしていないことだ。だから ポイント 3. 無理に XM L や」 SON を使おうとしない 検索してもらいたい。様々なページで解説されている。 XMLHttpRequest オプジェクトやその各種メソッドやプロバティーの使い方については、その名前で Web つ後の send メソッドの引数として指定することになっているので注意。 数を毎回替えるというこの原始的な方法が最も確実である。尚、 POST メソッドの場合の CGI 変数は、その一 いためのメソッドが用意されているのだが、これまたバージョンによって使い方が微妙に異なるので、 CGI 変 ようにしている。これで IE もキャッシュを使わなくなる。一応 XMLHttpRequest にはキャッシュを使わせな 間 ( のミリ秒単位を求める Date オプジェクトの利用 ) とすることで、アクセスする度、リクエスト内容が変わる シュ対策」とコメントしてある行の記述だ。 URL の後ろに、ダミーの CGI 変数を置き、その値として UNIX 時 実際の Web サーバーへはアクセスをしないという困ったクセがある。これを回避するテクニックが「キャッ これまた IE 対策なのだが、 IE は同じ内容で Ajax 通信を行うと 2 回目以降はキャッシュを見にいってしまい、 ポイント 2. キャッシュ回避テクニック るのかを気にせずオプジェクトが生成できる。 功するまで試みるのが最初の関数 createXMLHttpRequest() である。これを使えばどのプラウザーで動かされ い IE は ActiveX オプジェクトとして生成しなければならない。そこで、オプジェクトの生成を色々な手段で成 トの生成方法が違う ( オプジェクトの使い方は同じ ) 。 IE でも最近のものは他と同様の方法で生成できるが、古 IE (lnternet Explorer) は他のプラウザーと違って少々クセがある。まずは XMLHttpRequest オプジェク https : //developer. mozilla ・ org/j a/docs/Web/APl/XMLHttpRequest * 9 →レシピ 4.8 (HTML テープルを簡単綺麗に生成する ) → MDN (Mozilla Developer Network) サイトの XMLHttpRequest メソッド説明ペー 参照 る。これがやりたい場合は残念ながら XML や JSON を使うしかない。

4. Shell Script ライトクックブック

58 」 SON にエスケープ文字が混ざっている場合 第 3 章 POSIX 原理主義テクニック JSON は、コントロールコードや時にはマルチバイト文字をエスケープして格納している事がある。例えば "*n' や "*t ”はそれぞれタブと改行文字であるし、 "*uxxxx ” (XXXX は 4 桁の 16 進数 ) は Unicode 文字であ る。このような文字を元に戻すフィルターコマンド "unescj. sh" も同じ場所にリリースした * 7 。 詳細な説明は parsrj. sh と unescj. sh のソースコード冒頭に記したコメントを見てもらうことにして割愛す るが、 parsrj. sh で解読したテキストファイルをパイプ越しに unescj. sh に与えれば解読してくれる。もちろん unescj. sh も POSIX の範囲で書かれている。 解説 CSV がパースできたのと同様に、 JSON のパースも POSIX の範囲でできる。本章の冒頭で述べたことだが、 POSIX に含まれる sed や AWK はチューリングマシンの要件を満たしているのだから、それらを使えば理論的 にも可能なのだ。 CSV の時と同様、 JSON にも値の位置を示すための記号と、同じ文字ではあるものの純粋な 値としての記号があるが、冷静に手順を考えればきちんと区別・解読することができるのだ。とは言うものの具 体的にどのようにして実現したのかを解説するのは大変なので、どうしても知りたい人はソースコード読んでも こでの説明は割愛する。 らうことにして、 しかし、 JSON パーサーとしては。。 jq ”という有名なコマンドが既に存在する。にもかかわらず、筆者はなぜ こちらのコマンドなら POSIX 原理主義に基づいているため、「どこでも動く」「コン 再発明したのか。確かに パイルせずに動く」「 10 年後も 20 年後も、たぶん動く」の三拍子が揃っているという利点もあるのだが、真の 理由はまた別のところにあったので、ここで語っておきたい。この後のレシピで XML パーサーを作った話を述 べるが、同様の理由であるのでまとめて語ることにする。 」 SON & XML パーサーという「車輪の再発明」の理由 jq や xmllint 等、 UN Ⅸ哲学に染まりきっていない シェルスクリプトで、 JSON を処理したいといったら jq コマンド、 XML を処理したいといったら xmllint や hxselect (html-xml-utils というユーティリティーの 1 コマンド ) 、あるいは MacOSX の xpath といったコマ ンドを思い浮かべるかもしれない。そして、それらは「便利だ」という声をちらほら聞くのだが、私はちっとも 便利に思えない。試しに使ってみても「なぜこれで満足できる ? 」とさえ思う。理由はこうだ。 ー理由 1. ーっのことをうまくやっていない UNIX 哲学の一つとしてよく引用されるマイク・ガンカーズの教義に 1. 小さいものは美しい。 2. 1 つのプログラムには 1 つのことをうまくやらせよ。 というものがある。しかし、まずこれができていない。 jq や xmllint 等は、データの正規化 ( 都合の良い形式に 変換する ) 機能とデータの欲しい部分だけを抽出する部分抽出機能を分けていない。むしろ前者をすっ飛ばして 後者だけやっているように思う。 でも UNIX 使いとしては、部分抽出といったら grep や A Ⅵ TK を使い慣れているわけで、それらでできるよ うにしてもらいたいと思う。部分抽出をするために、 jq や xm Ⅲ nt 等独自の文法をわざわざ覚えたくないし。 https ://github.com/She11Shoccar-jpn/Parsrs/b10b/master/unescj ・ sh * 7

5. Shell Script ライトクックブック

16 の後に 解説 ー awk {print $ 1 } などを付け足せばよいので簡単だ。 第 1 章 ちょっとうれしいレシピ 間題文にもあるが、日本の祝日は、その全てを計算で求めることができない * 7 。春分の日、秋分の日の二祝日 は毎年の天文観測によって二年後の月日を決めるように定められているからだ。計算で求められないことが明ら かなら、知っている人に聞くしかない。そこで WebAPI を叩くというわけだ。 いくつかのサイトが提供してくれているが、 Google カレンダーを使うのが手軽だろう。 iCalendar 形式 祝日情報をどういう形式で教えてくれるかというと、 iCalendar(RFC 5545 ) 形式である。 Google カレン ダー自体は独自の XML 形式や HTML 形式でも教えてくれるのだが、 iCalendar 形式はシンプルだし、きちん と規格化されているので、情報源を他サイトに切り替える可能性を考慮するならこの形式を選択しておくべきで ある。 iCalendar 形式の詳細についてはもちろん RFC5545 のドキュメントを見れば載っているし、日本語解説は野 村氏が公開している「 iCale Ⅱ dar 仕様」 * 8 が参考になる。ただ、例示したソースコードの説明に必要な項目だけは ' ーに記しておこう。 まず、この形式は HTML タグと同様にセクションの階層構造になっている。ただし、 HTML のようなタグ のインデントは許されず、タグ (HTML 同様、こう呼ぶことにする ) 名は必ず行頭に来る。 今回注目すべきセクションは "VEVENT ”でありここに祝日情報が入っているため、まずこのセクションの 始まり (BEG 工 N:VEVENT) と終わり (END:VEVENT) でフィルタリングする。今回は祝日の日付と名称が欲しい だけなので、それらが収められているタグ ("DTSTART ”と "SUMMARY ” ) 行だけになるよう、さらにフィ ルタリングする。あとは、 VEVENT セクションの中にあるこれら日付と名称の値を取り出して、 1 つ 1 つの VEVENT 毎に横に並べれば目的のデータが得られる。 Goog 厄カレンダーの URL ソースコードの中にもメモしているが、祝日一覧を返してくる WebAPI の URL は 2014 / 12 / 20 現在、次の ように辿れば見つけることができる。 G 。。 gle の都合によって将来移動する可能性もあるので、参考にしておい てもらいたい。 1 ) 2 ) 3 ) 4 ) 5 ) ログインして Google カレンダーを開く ( ただし最終的に得られた URL 自体はログインせず利用可能 ) ( 歯車マークアイコンの中の ) 「設定」メニュー 画面上部に「全般」「カレンダー」とある「カレンダー」タブ 「日本の祝日」リンク 「カレンダーのアドレス」行にある” ICAL ”アイコン 、 7 天文学データを入れれば「予測」することは可能だが、サーバー管理者にとって現実的な話ではない。 * 8 http : //www. asahi—net. 0 て . jprci5m—nmr/iCa1/ref . tml

6. Shell Script ライトクックブック

レシピ 3.8 全角・半角文字の相互変換 (a) 購入品の 2 番目を取得する ノート ()4 , 無地 ) $ ・ /parsrx ・ sh s ple ・Ⅷ 1 ー awk ' $ 1 ~ / 取寄商品 $ / リ sed ' 2s たに ] * / / (b) 全ての取寄商品名を抽出 $ . /parsrx ・ sh s ple ・Ⅷ 1 ー awk ) $ 1 ~ / 取寄商品 $ / リ sed 's/- に ] * / / 替え芯 6 穴パンチ 解説 61 POSIX 範囲内で実装した CSV 、 JSON パーサーを作ったのなら当然次は XML パーサーであるが、もちろ ん作れた。ただ、 XML はプロバティーとしての値とタグで囲まれた文字列としての値というように値が 2 種類 あったり、コメントが許されていたりするため、さらに複雑であった。複雑であるため、こちらもどうやって実 現したのかをどうしても知りたい人はソースコード読んでもらうことにして、説明は割愛する。 HTML テキストへの流用 最初でも触れたが HTML テキストのパーサーとして使えるかどうかは場合による。厳密書かれた XHTML になら使えるが、既に述べたように多くの Web プラウザーはいい加減な HTML を許容するうえ、 HTML の規 格自体が閉じタグ無しを許したりするのでそのような HTML テキストが与えられると、うまく動かないだろう。 ただし、「いい加減な記述が混ざっている HTML ではあるが、中にある正しく書かれた <table> の中身だけ 取り出したい」という場合、 sed コマンド等を使って予めその区間だけ切り出しておけば流用可能である。 下記のような正直な処理を行うプログラムを書けばよい。 回答 ることさえできればあとは簡単なのだが。 大文字・小文字を区別せず、更に全角・半角も区別せずにテキスト検索がやりたい。全角文字を半角に変換す 問題 レシピ 3.8 全角・半角文字の相互変換 →レシピ 3.6 (JSON ファイルを読み込む ) →レシピ 3.5 (CSV ファイルを読み込む ) 参照 ・テキストデータを 1 バイトずつ読み、各文字が何バイト使っているのかを認識しながら読み進めていく。

7. Shell Script ライトクックブック

126 sUr1—aj ax 'zip2addr. ajax ・ cgi' / / ーー 2 ) 郵便番号を取得する一 第 6 章 レシピを駆使した調理例 if ( ! document. getEIementById( ' inqZipcode1 ' ) . value. match()( [ 0 ー 9 ] { 3 } ) $ / ) ) { alert ( ' 郵便番号 ( 前の 3 桁 ) が正しくありません , ) ; return; ” " + RegExp. $1, sZipcode if ( ! document. getE1ementById( ' inqZipcode2' ) . value. match(P ( [ 0 ー 9 ] { 4 } ) $ / ) ) { alert ( , 郵便番号 ( 後の 4 桁 ) が正しくありません , ) ; return; sZipcode ー + sZipcode + RegExp. $1 ; / / ーー 3)Ajax コール xhr = createXMLHttpRequest ( ) ; function zip2addr—ca11back(xhr , sAj ax—type) { xhr. send(null) ; xhr. onreadyst at e change function() {zip2addr-ca11back (xhr , sAj ax—type) } ; 五て . open( 'GET' , sUr1—to—get , true) ; sUr1-t0-get + = '&dummy=' + parselnt ( (new Date)/1) ; / / プラウザ cache 対策 sUr1—t0—get + = '?zipcode=' + sZipcode; sUr1—aj ax ; sUr1—to—get if (xhr) { var oAddress ; e ; / / サーバーから受け取る住所オプジェクト / / 汎用変数 ( エレメント用 ) var sE1m-postfix; / / 住所入力フォームエレメント名の接尾辞格納用 / / ーー 4 ) 住所入力フォームエレメント名の接尾辞を決める一 switch (sAjax-type) { case 'API_XML' case 'API_JSON' default sE1m—postfix sE1m—postfix sE1m—postf ix ' API_XML ' '_API_JSON' ・ break; break; break; / / ーー 5 ) アクセス成功で呼び出されたのでないなら即終了ー 0 if (xhr . status if (xhr. readyState ! = 4 ) {return;} if (xhr . status ) {return ; } = 400 ) { alert ( , 郵便番号が正しくありません , ) ; else if (xhr. status ! return; alert ( ) アクセスエラー ( ' + xhr. status + ' ) ' ) ; = 200 ) { return ; alert(' 対応する住所が見つかりませんでした , ) ; if (oAddress ['zip'] oAddress JSON. parse(xhr. responseText) ; / / ーー 6 ) サーバーから返された住所データを格納ー

8. Shell Script ライトクックブック

S 〃 & 一 L ん C00 たわ 00 た 2074 石市朝れ Shell Script ライトクックプック 2014 ー pos Ⅸ原理主義を貫く 定価 ( 本体 1 , 000 円 + 税 0 % ) 影の発行元 / 秘密結社シェルショッカー日本支部 Rich Lab. 発行所 / まつらリッチ研究所 アナタの想像以上にあります。 や XML の解析、 C 。 okie の生成などなど、できる仕事はきっと に目を通してからにした方がいいでしよう。時間計算や JSON と言っているそこのアナタ、 POS Ⅸを見くびるのは本書の目次 唱えるまでに至りました。「一体 POS Ⅸの範囲で何ができる ? 」 どこでも動くことに前回以上にこだわって、 POSIX 原理主義を プトレシビ集の続編が 9 年ぶりに登場。 UN Ⅸを名乗る OS なら 2005 年に第一弾を発行し、ロングセラーとなったシェノレスクリ ンルー

9. Shell Script ライトクックブック

67 第 4 章 POS Ⅸ原理主義テクニック -Web 編 できることに驚いてくれる人が多いが、驚くのはまだ早い ! Web アプリケーションを作るうえで役立つ数々の 前章の POSIX 原理主義テクニックは堪能してもらえただろうか。筆者の周囲では JSON 、 XML のパースが 回答 問題 レシピ 4 ユ U RL デコードする のキーワードで Web 検索して動作画面やソースコードを見てみるといい。 アプリケーション「メトロバイバー」は、 し、本章のレシピを読めば現実味が湧く事だろっ レシピはこれから紹介するのだから。 これらのレシピを活用して作ったものだ。信じられないなら、これら 事実、ショッピングカートの「シェルショッカー」、東京メトロのオープンデータに基づく列車接近情報表示 そもそも POSIX の範囲で Web アプリケーションを作ること自体、驚く以前に、信じられないようだ。しか ワードは URL 工ンコードされた状態であり、デコードしないとわからないのでデコードしたい。 Web サーバーのログを見ていると、検索ページからジャンプしてきている形跡があった。しかし、検索キー こんな感じだ。 つかるたびに printf 関数を使ってその 16 進数に対応するキャラクターに置き換えればよい。 AWK で書くなら そんなに難しい仕事でないから素直に書いて作る。基本的には正規表現で "%C0-9A-Fa-f]{2} ”を検索し、見

10. Shell Script ライトクックブック

レシピ 4.6 Ajax で画面更新したい •CLOCK. HTML く html> く he ad> く tit1e>Ajax C10ck く /title> く style type="text/css"> #clock {border: lpx solid;width 20em} く script type="text/javascript" src="CLOCK. JS"> く /script> く /he ad> く body onload="update—clock() " > く h1>Ajax CIOCk く / れ 1 > く div id="clock"> く dl > く dt>Date : く / dt > く dd > 0000 / 00 / 00 く / dd > く dt>Time : く /dt> く dd>00 : 00 : 00 く / dd > く / d1 > く /div> く input type="button" value="update" onclick="update—clock() " > く /body> く /html> 次に Ajax 通信時にサーバー上でレスポンスを返す CGI スクリプト。 Web プラウザーから Ajax として呼ば れた際、現在時刻を取得して前述 HTML のく div id = " cl 。 ck " > ~ く / div > の中身を生成して返すというものだ。 この CGI スクリプトが XML や JSON ではなく、部分的な HTML を返しているという点も JavaScript ライプラリー依存から脱するための重要な工夫だ。 •CLOCK. CGI # ! /bin/sh datetime=$ (date , + %Y/%m/%d %H : %M : %S , ) cat くく HTTP_RESPONSE Content—Type : text/html く dl > く dt>Date : く /dt> く dd>${datetime% *} く /dd> く dt>Time : く /dt> く dd>${datetime#* } く /dd> exit 0 HTTP_RESPONSE く / d1 > そして最後に、 Ajax 通信を行う JavaScript(CLOCK. (S) の中身は次のとおりだ。