投稿

ラベル(xml)が付いた投稿を表示しています

.htaccessで特定のファイルだけ参照不可(禁止)にする

XMLファイルに設定情報を記述すると読みやすいけど、ファイルのアドレスを指定されると外部から参照できてしまうので、どうしようかなと思ったときのメモ。 .htaccessが使えるなら特定のファイルだけ参照できないように設定が可能。 xmlだけ参照不可にする場合は次のように記述する <Files ~ "\.xml$">   deny from all </Files> 詳しくは ここのサイト を参考に。 .htaccessはほとんどのレンタルサーバーで使えると思うけど、自前のサーバーの場合はAllowOverride Allの設定を忘れずに Alias /site /opt/www/ <Directory "/opt/www/">    AllowOverride All    Order allow,deny    Allow from all </Directory> 前の記事も参考に。 .htaccessと.htpasswdで簡易ユーザ認証 Googleカレンダーにicalを読み込ませるapacheの設定を前に書いたので、そっちも参考になるかも。 GoogleカレンダーにだけiCal形式のファイル参照を許可する

PHP5でXML + XSLTを使う

イメージ
仕事でXML + XSLT => HTMLのシステムを作っていたので、PHPでもXSLTを使えないかなぁと思ったりしてます。ただPHPが詳しくなった今、XML + XSLTで幸せになれる場面がそんなに思い浮かばないので、まぁいつか役に立つ技術ぐらいかなぁというイメージです。 PHP4ではXSLTは Sablotron だったようですが、PHP5では libxslt になりました。詳細は ここ のPHP4とPHP5のXMLサポートの違いを参照。 以下PHP4でXSLT変換していたのをPHP5に移行したときのメモ。 さくっと動くかと思いきやxsl:for-each文でほとんどエラーとなるので調べてみたら、ほかの人達はexsl:node-setという関数を使っているみたい。sablotronやmsxmlだとテンプレートに引数として渡すと自動で判断してくれたのに・・・ Windowsサーバでmsxmlを使っていた人は予想ができると思うけど、exsl:node-setは引数をノードセットとして評価してくれるらしい。 exsl:node-setを使うにはEXSLTというコンポーネントがインストールされている必要があるみたい。 ここ phpinfoでみると下のようになってれば使える。 実際に使うときには名前空間を宣言するのを忘れずに。 <xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform" xmlns:exsl=" http://exslt.org/common" > 名古屋のおもしろ会社エクスブリッジ

【PHP】【DOM】ノードをコピーする方法

PHPのDOMを使ってXMLを操作していると、別々に作ったDOMを一つのノードにまとめたい場合があります。cloneNodeとか使って簡単にできるかと思ったけど、ちょっとつまずいたのでメモ。 最初に書いたコード↓ $objDom2 = new DOMDocument(); $objDom2->encoding = 'UTF-8';  //文字化け対策. $objDom2->formatOutput = true;  //字下げや空白を考慮してきれいに整形した出力を行う。. $objNode = $objDom2->appendChild( $objDom2->createElement('copy') ); $objNode->appendChild( $objAddNode->cloneNode(true) ); echo $objDom2->saveXML(); 単純にもう一つDOMドキュメントを作ってコピーしたいノードをcloneNodeを使って追加しようとしてる。しかし、これだと'Wrong Document Error'で怒られる・・・。JavaScriptだとできたのに・・・。 調べてみると importNode を使って、現在のDOMドキュメントに関連づけを変更しないと追加できないみたい。 修正したコード↓ $objDom2 = new DOMDocument(); $objDom2->encoding = 'UTF-8'; //文字化け対策. $objDom2->formatOutput = true;  //字下げや空白を考慮してきれいに整形した出力を行う。. $objNode = $objDom2->appendChild( $objDom2->createElement('copy') ); $objNewNode = $objDom2->importNode( $objAddNode, true ); $objNode-...

【PHP】XMLReaderでXMLを高速に処理をする

ここ と ここ でDOMとSimpleXMLについて書きましたが、調べていくうちに目にとまるようになったのがXMLReaderなるもの。 XMLReaderを使うとread()を行うたびに階層(ノード)単位で読み込んでいくので、すべてのXMLを読み込まなくても、必要な階層(ノード)に辿りついた時点で処理を行えます。そのため、大きなXMLファイルを扱う場合などメモリの消費を抑えることができ、高速に処理ができるようです。 ここ にサンプルコードがあるのでメモ。マニュアルは ここ 。 XMLReaderはPHP5.1.0以上であればデフォルトで組み込まれているので、インストールは不要。 大量のデータをXMLでやり取りする場合は必須となりそう。

【PHP】SimpleXMLを使ってXMLを直感的に操作

ここ の続き。PHP5のDOMでXMLを操作するときにXpathの記述方法のめんどくささに萎える。JavaScriptみたいにselectSingleNodeとかselectNodesとか書きたくなるけど、これができない。 DOMXpath を使うとこんな感じ $objDom = new DOMDocument(); $objDom->preserveWhiteSpace = false; //余分な空白を取り除く. $objDom->load('sample.xml'); $objXpath = new DOMXPath($objDom); $sQuery = '//root/comment'; $objSelectNodes = $objXpath->query($sQuery); echo $objSelectNodes->item(0)->nodeValue; echo $objSelect->item(0)->getAttribute('id'); Xpathを記述しようと思うだけで別のオブジェクトを生成しないといけないので、非常にめんどくさい。 こういう場合はSimpleXMLを使うと非常に分かりやすくなる。上のコードをSimpleXMLを使って書くとこんな感じ $objDom = new DOMDocument(); $objDom->preserveWhiteSpace = false; //余分な空白を取り除く. $objDom->load('sample.xml'); //SimpleXMLの方が扱いやすいので変換. $objXml = simplexml_import_dom($objDom); $sQuery = '/root/comment'; $objSelectNodes = $objXml->xpath($sQuery); //配列で返る. echo $objSelectNodes[0];       //nodeVa...

【PHP】DOMを使ってXMLを操作(導入インストール編)

イメージ
PHPでXMLを扱いときによく使われるのが DOM 。 気をつけないといけないのがPHP4とPHP5では使用するメソッド名がかなり違うので、システム構築する際は環境をちゃんと確認しないといけない。どっちでも動くように作り込むのはかなり大変そう・・・。 参考 。 PHP4:DOM XML関数 $dom = domxml_open_file($xmlfilename); PHP5:DOM Function $dom = new DOMDocument; $rtn = $dom->load($xmlfilename); ちなみにインストールは簡単でPHP5の場合 # yum install php-xml # service httpd reload で終了。 phpinfoで確認するとDOMの項目が表示されている。 JavascriptでDOMを使ったことがあるなら、PHP5のメソッドは見慣れたものばかりなのでプログラムは(比較的)作りやすい。 なぜならPHP5で標準DOMインターフェイスに対応したから。 参考 。 でもXpathを使った記述方法は、JavaScriptに比べめんどくさい。その辺は SimpleXML と組み合わせて使うと幸せになれる。 これについてはまた後日書きます。 PHP4で作りたいときは ここ のマニュアルを参考に。 PHP5は こっち 。 XMLを読み込むサンプルコード $objDom = new DOMDocument(); $objDom->preserveWhiteSpace = false; //余分な空白を取り除く. if ($objDom->load('sample.xml')) { return $objDom; } else { return null; } preserveWhiteSpaceはインデント部分の余分な空白を取り除いてくれるので、空白で悩まされなくていい。ファイルに書き出すときのサンプルコード $objDom = new DOMDocument(); $objDom->encoding = 'UTF...