[php] XSDを使ってXMLが正しいかvalidationをする方法

phpを使ってXMLのスキーマバリデーションってできるのだろうか?ということで調べました。DOMDocumentというクラスを使うことで対処可能でした。

XSDってなんですか?

XSDというのは、XMLの構造を定義した文書です。
このXSD(スキーマ)に照らして、XMLが正しいかどうかを検証する作業がバリデーションです。このバリデーションを利用することで、想定しない構造をしているXML文書を弾くことが可能になります。

PHPでスキーマバリデーション

PHPでスキーマバリデーションを利用するには、DOMDocumentというクラスを利用します。
PHPでXMLを扱うには2つ方法があって、simpleXMLとDOMDocumentがあるんですが、そのうちの複雑な方ということになります。

実際にバリデーションする際のコードは以下のようになります。

上記の例だと、バリデーションの対象となるXMLがsample.xmlというファイルの内容で、これの構造を定義したXSDファイルがsample.xsdというファイルになります。
DOMDocumentに対して、load関数でXMLを読み込んでおいて、schemaValidate関数でXSDを指定して、判定ってかんじですね。
バリデーションの結果、XMLがXSD通りの構造をしていればtrueが、XSDに反した構造になっていればfalseが返ってくるという感じです。

XSDのエラー

以下のようなエラーが出ている場合、正しくバリデーションができていません。

このエラーが言っている内容は直接はよくわかりませんが、とりあえず、こういう感じのエラーがたくさん出ている場合には、バリデーションが正常に行われていません。

この場合は、XSDの冒頭で以下のような定義が抜けています。

3行目のxmlns=っていう部分です。デフォルトのnamespaceを指定してあげる文?みたいです。ちなみに、これはtargetNamespaceと同じ値にしておけば問題なさそうです。

おしまい

以上で無事にバリデーションができます。ちなみに、バリデーションに失敗した場合、エラー理由はWarningで出力されます。
エラー理由をうまくキャッチして、その後の分岐に活かすとかそういうことはできるのでしょうか…その辺はまたこんど調べてみようと思います。。

2014-03-12 | PHP, Web技術

  • ■ システムの科学
    システム創成学科のシミュレーションコース的にはバイブル的存在であったと認識しております(笑)社会システムや人工物をどのように設計していくかについて俯瞰的に書かれているので、自分の思考のフレームができます。
PAGE TOP ↑