XSD よりも複雑な Schematron で XML ファイルを検証しようとしています。私はたくさんグーグルで検索しましたが、最高のものはこのマイクロソフトのウェブサイトです。しかし、それは私が必要としていない NMatrix.Schematron を使用して XSD で検証する方法のみを示しています。NMatrix.Schematron DLL がありますが、その使用方法がわかりません。誰もそれを使用する方法を知っていますか?
3 に答える
Nuget の Saxon-HEを使用することをお勧めします。これは、現在 .NET で Schematron よりも多くの機能をサポートしているためです。
私はSchematron.NETを使用しています - ソースとサンプルをダウンロードし、コンパイルするか、サンプルで DLL を使用します。
次に、画像の XSLT は不要だったので、完全に切り取りました。しかし、choice などのいくつかのものが欠落していますが、ほとんどは XPath を使用してテストできます。少し古いため、すべての機能を実装しているわけではありません:(
これは、Schematron で検証するための拡張バージョンです
using NMatrix.Schematron;
...
Schema schematronSchema = new Schema();
schematronSchema.Load(new FileStream("C:/thefile.sch", FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
vld.AddSchema(schematronSchema);
vld.Validate(new MemoryStream(Encoding.UTF8.GetBytes(XML_String)));
ファイルがロックされないように、ファイル ストリームを使用してロードします。
次に、「.sch」ファイル内では、スキーマデータを検証するための私の意見では、単純ではるかにきれいです。
<?xml version="1.0" encoding="utf-8" ?>
<schema xmlns="http://www.ascc.net/xml/schematron" title="Schema for Blah">
<pattern name="A descriptive name">
<rule context="DataNodeOrElement">
<assert test="Xpath, where Name is element and @name is attribute"> Error Message </assert>
</rule>
</pattern>
例えば。
<root>
<version>1</version>
<data>
<name surname="rulez">ppumkin</name>
<age>na</age>
<title/>
</data>
</root>
<rule context="data">
<assert test="name != ''"> No name specified </assert>
<assert test="@surname != 'rulez'"> This is not the ppumkin I know!</assert>
<assert test="number(age) < 110"> Not a number or not specified</assert>
<assert test="number(age) > 18"> Your under age. Get 'outa!ahere!</assert>
</rule>
テストが失敗した場合にのみエラーが発生することに注意してください。つまり、18 歳未満のユーザーをブロックすることに関心がある場合は、18 歳以上かどうかをテストする必要があります。慣れるには少し奇妙です。
私はこれまでスキーマトロンを使用したことがありませんでした。正直なところ、今では XML をエボラ出血熱やそれに関連するものと同じように扱っていますが、選択の余地がないこともあります。
Schematron.NET の例では、XSLT1/XLST2 と Schematron を組み合わせて制御と決定を強化する方法を示しています。
代わりに、Michael Kay のSaxonなどの確立された XSLT プロセッサを備えた、純粋な XSLT (できれば XSLT 2.0) を使用した Rick Jelliffe のISO Schematron の参照実装を使用することをお勧めします。