XSDによるXML検証
XML文書をXSDに照らして検証し、どの要素がどのルールに違反しているかを表示します。
このツールはサーバーで動作します。 XML Schemaによる検証はブラウザではできないため、文書とスキーマはここに送信されて検証され、その後破棄されます。保存も記録もされず、URLに含まれることもありません。文書が機密の場合は、代わりにxmllintをローカルで実行してください。同じエンジンです。
文書と、それが準拠すべきXSDを貼り付けてください。判定結果に加えて、違反したルールごとに要素、行、制約が表示されます。「無効」の一言だけではありません。
仕組み
失敗しうることは3つあり、意味が異なるため個別に報告します。文書が整形式のXMLでない場合、何も検証されていません。スキーマが使用可能なXSDでない場合も、何も検証されていません。あるいは両方とも読み込めたうえで文書がルールに違反した場合で、「無効」がデータについて何かを教えてくれるのはこの場合だけです。
検証にはlibxmlを使っています。ほぼすべてのXMLツールの背後にあるのと同じエンジンなので、結果はあなたのビルドが出すものと一致します。診断メッセージは届いたまま英語で表示します。要素と制約の名前が含まれており、言い換えれば、私たちが書いたのではないメッセージの意味を推測することになるからです。
このツールはサーバー上で動作し、このサイトでそうするのはこのツールだけです。ブラウザではXML Schemaによる検証ができません。そのためのAPIがないのです。文書とスキーマは送信され、検証され、破棄されます。ディスクに書き込まれることも、ログに記録されることも、URLに含められることもありません。
2つのものは無条件で拒否します。1つは、DTDまたはエンティティを宣言する文書やスキーマです。DTDはパーサーにサーバー上のファイルを読ませることができるからです。もう1つは、ほかのファイルをimportまたはincludeするスキーマです。ここでは何も取得しないため一部しか適用できず、部分的な検証を合格として示すことは、バリデーターが返しうる最悪の答えだからです。
例
| ケース | 入力 | 結果 |
|---|---|---|
| 型の誤った値 | <price>cheap</price> | Element 'price': 'cheap' is not a valid value of the atomic type 'xs:decimal'. |
| 必須属性の欠落 | <book><title>V</title><price>1</price></book> | Element 'book': The attribute 'id' is required but missing. |
| 子要素の欠落 | <book id="b1"><title>V</title></book> | Element 'book': Missing child element(s). Expected is ( price ). |
よくある質問
文書はブラウザの外に送信されますか?
はい。このサイトでそうなるのはこのツールだけです。XML Schemaによる検証はブラウザにはできないため、文書とスキーマはこちらに送信され、検証され、破棄されます。保存も、ログへの記録も、URLへの記載もされません。お手元の文書でそれが許容できない場合は、ご自身の端末で検証してください。xmllintが同じエンジンで同じことを行います。
別のファイルをimportしているという理由で、なぜスキーマが拒否されたのですか?
ネットワークからもファイルシステムからも、何も取得しないためです。複数のファイルに分かれたスキーマは、ここでは半分しか適用できません。ルールの半分だけを確認して「有効」と答えるバリデーターは、何も答えないより悪い答えを返しています。ファイルを1つにまとめるか、もう一方のファイルが存在するご自身の端末で検証してください。
なぜDOCTYPEが拒否されるのですか?
DTDはサーバー上のファイルを指すエンティティを宣言できるからです。これはXMLパーサーをファイル読み取り装置に変える、最も古くからある手口です。ここではエンティティの読み込みも無効にしているため、この構文の拒否は2つ目の鍵であって唯一の防御ではありません。いずれにせよ、XSDに照らして検証する文書にDTDは不要です。
なぜエラーメッセージが英語なのですか?
このサイトではなくlibxmlが出力しているからです。メッセージには要素名と違反した制約が引用されており、それこそが必要な部分です。翻訳すれば、私たちが書いたのではない診断を言い換えることになります。1つでも誤訳すれば、英語で読むより高くつきます。
XML Schemaのどのバージョンですか?
libxmlが実装しているXSD 1.0です。XSD 1.1のアサーションと条件付き型割り当てには対応していません。そのため、それらを使う1.1のスキーマは、該当ルールを黙って無視して検証されるのではなく、読み込めないものとして報告されます。
スキーマが encoding="utf-16" で始まっていたために拒否されました。なぜですか?
その宣言はファイルを説明するものですが、このページに届くのはブラウザが送信したもの、つまりUTF-8だからです。libxmlは宣言を信じ、スキーマの読み込みを拒否していました。現在は、UTF-8以外を示す文字コード宣言は常に破棄され、結果にもそのことが表示されます。以前は encoding="ISO-8859-1" の場合のほうが深刻でした。失敗しなかったからです。アクセント付きの文字がすべて黙って文字化けし、誰も書いていないテキストに対して文書が検証されていました。
知っておきたいこと
- サーバー上で動作します。文書とスキーマは送信され、検証され、破棄されます。保存もログへの記録もされず、URLで共有することもできません。このカテゴリのほかのツールはすべてブラウザ内で動作しますが、このツールはそうできません。XML Schemaを検証できるブラウザがないからです。
- 判定はlibxmlによるもので、診断メッセージの文言もすべてlibxmlのものです。XSD 1.0のみ対応。
- 表示する問題は最大50件です。1つのルールに1,000回違反している文書は、たいてい1つの原因で違反しています。