自前で出力したsitemap.xmlがgoogleにはじかれたので、XMLスキーマの検証処理をPythonでもやりたいなぁと思って調べてみたら、簡単に出来ました。さすがPythonということでメモ書きです。
lxmlを使うのですが、インストールはコチラを参考に行いました。ありがとうございます。処理手順は非常に簡単で、以下のような感じになります。etree.parseにファイル(ライク)オブジェクトを食わせるのがちょっと注意が必要ですが、それ以外は非常に簡単ですね。要はスキーマオブジェクトを作って、検証したいXMLのDOMを食わせればOKです。
def validate(schema, xml): schema_doc = etree.parse(schema) xml_doc = etree.parse(xml) xmlschema = etree.XMLSchema(schema_doc) if xmlschema.validate(xml_doc): return True else: raise "E: %s" % (str(xmlschema.error_log.last_error))
検証に失敗した際のエラーはXML Schemaを利用した場合はerror_logを使います。結構しっかりとしたエラーメッセージを出してくれるので、十分バリデータとして使えると思いました。上記メソッドを使って以下のように使います。
print validate(open('sitemap.xsd', 'r'), # スキーマと open('sitemap.xml', 'r')) # 検証対象XMLをファイル(ライク)オブジェクトとして渡す
今回はXMLSchemaを使いましたがDTDやRelaxも同じように扱えます。詳細はlxmlのドキュメントを見て下さいませ。何となくラッパーモジュールが存在してそうな気がしますが、今はこれで十分なので探していません。
これ書いててXML久々に触ったなぁと思いました。数年前はXMLを妄信していて何でもXMLで処理しようとしていましたが、今は完全にJSONに改宗していて、XMLは使いたくないデータ表現に成り下がってしまいました。思い返すとXMLが一番美しい!とか痛い発言を繰り返していたので恥ずかしいです。どうでもいいですね。


[...] This post was mentioned on Twitter by taichino. taichino said: Blogged PythonでXMLの検証を行いたい件 http://bit.ly/cwJG8k [...]