短編小説:
コードでXSDスキーマを使用してXSDファイル(すべてのXSDはXML自体)を検証し、(テキストとしてのxml)エディターで同じXSDファイルを開いたときにVisualStudioが表示するのと同じ警告またはエラーを取得したいと思います。
Visual Studioは、xmlエディターに警告を表示します(以下を参照)。
私の問題は、コードで行われた検証で100%成功することです。警告なし、何もありません。私は何が欠けていますか?
長い話:
XSDファイルは定義上XMLファイルであるため、W3Cxsdスキーマに対するXML検証を使用してカスタムXSDを検証しています。
検証されるXSDと、VS 2010で示される警告は次のとおりです。
(imgをクリックしてズーム)
目を細めるのを避けるために、ここに少し警告があります:
ワイルドカード「##any」は要素「Com.Example.Config:permissionConfig」を許可し、コンテンツモデルをあいまいにします。コンテンツモデルは、[... tl;dr]のように形成する必要があります
これは私のカスタムXSDです:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema
xmlns:tns="Com.Example.Config"
elementFormDefault="qualified"
targetNamespace="Com.Example.Config"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="Com.Example.Config.PermissionConfigCT" />
<xs:complexType name="Com.Example.Config.PermissionsCT">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="permissionConfig" type="tns:Com.Example.Config.PermissionConfigCT" />
<!-- next line triggers the warning -->
<xs:any minOccurs="0" processContents="lax" />
</xs:sequence>
</xs:complexType>
</xs:schema>
VSによる検証に使用されるスキーマを(メニューXML->スキーマから)チェックすると、以下を使用していることがわかります。
xsdschema.xsd
(FWIW 、XSD用のW3C元のスキーマから派生し、DTDパーツはありません)xml.xsd
(前のxsdで、親戚によって参照されていますinclude
)
両方のファイルが(私のマシンに)ここにあります:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\xml\Schemas
簡単に参照できるように、両方を実行可能ファイルと同じディレクトリにコピーしました。
完全を期すために、xsdschema.xsd
は名前空間を定義する方法を次に示します。
<xs:schema
targetNamespace="http://www.w3.org/2001/XMLSchema"
blockDefault="#all"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xml:lang="EN" version="1.0"
xmlns:vs="http://schemas.microsoft.com/Visual-Studio-Intellisense">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xs:complexType name="openAttrs">
[...]
...そこで、VSが使用しているのと同じXSDを使用して、簡単な検証コードを作成しました。これはコードです:
var configXsdPath = "XMLFile1.xml";
//that's my custom XSD file, don't let the extension fool you
var xmlSchemaForXsdPath = "xsdschema.xsd";
var settings = new XmlReaderSettings
{
ValidationType = ValidationType.Schema,
ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings
| XmlSchemaValidationFlags.ProcessSchemaLocation
| XmlSchemaValidationFlags.ProcessIdentityConstraints
};
using (var tr = XmlReader.Create(xmlSchemaForXsdPath))
{
settings.Schemas.Add(XmlSchema.Read(tr, (i_sender, i_args)
=> {throw new InvalidOperationException(
"The validating XSD is itself invalid");} ));
}
settings.ValidationEventHandler += (i_sender, i_args)
=> { throw new Exception(i_args.Message); };
var reader = XmlReader.Create(configXsdPath, settings);
while (reader.Read())
//parse it all
{ }
...そして例外は一切ポップアップしません...
更新次へ私は完全に無効なXMLをフィードしようとしました:カスタムXSD内のどこかにこの要素を追加しました:
<aaa!></aaa>
そしてコードは予想されるエラーを与えます*:
名前空間' http://www.w3.org/2001/XMLSchema 'の要素'schema'には、無効な子要素'aaa'があります。予想される可能な要素のリスト:'simpleType、complexType、group、attributeGroup、element、attribute、notation、annotation'名前空間' http://www.w3.org/2001/XMLSchema '。
-
- ある時点で、無効なXMLを追加してもエラーは発生しないと簡単に述べました。それはPEBKACの場合でした。