2

短編小説:

コードでXSDスキーマを使用してXSDファイル(すべてのXSDはXML自体)を検証し、(テキストとしてのxml)エディターで同じXSDファイルを開いたときにVisualStudioが表示するのと同じ警告またはエラーを取得したいと思います。

Visual Studioは、xmlエディターに警告を表示します(以下を参照)。

私の問題は、コードで行われた検証で100%成功することです。警告なし、何もありません。私は何が欠けていますか?

長い話:

XSDファイルは定義上XMLファイルであるため、W3Cxsdスキーマに対するXML検証を使用してカスタムXSDを検証しています。

検証されるXSDと、VS 2010で示される警告は次のとおりです。
(imgをクリックしてズーム)

XML警告

目を細めるのを避けるために、ここに少し警告があります:

ワイルドカード「##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の場合でした。
4

2 に答える 2

2

簡単に言えばnext line triggers the warning、XSDを検証することによって達成しようとしていること(つまずくバリデーター)は機能しW3C xsd schemaません。これはUniqueParticleAttributionと呼ばれ、XSD言語では記述できません。問題は、これはほんの始まりに過ぎないということです。最終的に使用するXSD機能が多いほど、提案された検証の信頼性は低くなります。

XSDを実際に検証しようとしている場合は、少なくとも.NETでは、XmlSchemaSetを使用してください。UPAチェックのオンとオフを切り替えるに、次のようにします。

于 2013-02-19T01:03:48.457 に答える
2

Petru Gardeaの回答からの優れた洞察:XSDをXMLとして扱うことは、検証時にのみ行われるため、代わりに(またはそれに加えて)XSDとして扱います。

これと同じくらい簡単です:

var schemas = new XmlSchemaSet();
using (var tr = XmlReader.Create(xsdPath))
{
    schemas.Add(null, tr);
              //null means 'use the target namespace specified in the XSD'
}
//schemas.CompilationSettings.EnableUpaCheck = true; //it's true by default

schemas.Compile();

XmlSchemaException上記のコードを実行すると、VisualStudioによって指定された正確な説明がスローされます。

System.Xml.Schema.XmlSchemaException:ワイルドカード'## any'は、要素'Com.Example.Config:permissionConfig'を許可し、コンテンツモデルをあいまいにします。要素情報アイテムシーケンスの検証中に、シーケンス内の各アイテムの検証を試みるために直接、間接的、または暗黙的に含まれる粒子が、コンテンツまたは属性を調べることなく一意に決定できるように、コンテンツモデルを形成する必要があります。そのアイテムであり、シーケンスの残りのアイテムに関する情報はありません。

于 2013-02-19T12:34:51.330 に答える