0

xsdで検証する必要があるxmlクエリがあります...(不可能??)

残念ながら、xmlのxsdスキーマには、2つのシーケンスの間にxsd:choiceが含まれています。

しかし、私はxmlクエリでこれらのシーケンスの両方を指定しています。

これにより、xsdはxmlに失敗します。このチェックをオーバーライドする方法については、どのような方向ですか?

提供された:

1. XSDスキーマは標準化されており、変更できません。

2.変更は、検証を適用する場所の背後にあるC#コードで行う必要があります。

同じことが尋ねられました:

XSDに対してXMLを検証する際に要素の順序を無視する

しかし、そこにあった答えは、xsdスキーマを変更することでした。これは、ユーザーが受け入れた答えでした。

update1

xmlはこれに似ています:

...
<elem>
    <subElemA>textValA</subElemA>
    <subElemB>textValA</subElemB>
<elem>
...

しかし、XSDは言う:

...
<xsd:choice>
    <xsd:element name="subElemA" minOccurs="0" maxOccurs="1">
    </xsd:element>
    <xsd:element name="subElemB" minOccurs="0" maxOccurs="1">
    </xsd:element>
</xsd:choice>
...

&xmlからsubElemAまたはsubElemBのいずれかを削除した場合、xmlは正常にスキーマ検証されます。

update2

スキーマバリデーターがこのチェックをバイパスできるようにスキーマ検証コードを微調整することを含む解決策を見つけたいと思っています。スキーマ検証のコード:

   XmlReaderSettings setting = new XmlReaderSettings();
   setting.ConformanceLevel = ConformanceLevel.Document;
   setting.IgnoreComments = true;
   setting.IgnoreWhitespace = true;
   setting.IgnoreProcessingInstructions = true;
   setting.ValidationType = ValidationType.Schema;
   setting.Schemas.Add(defaultNameSpace, schemaLocation.AbsoluteUri);
   setting.ValidationEventHandler += new ValidationEventHandler(this.SchemaValidationCallBack);
   MemoryStream ms = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(xmlToValidate));
   XmlReader reader = XmlReader.Create(ms, setting);
   while (reader.Read());
4

1 に答える 1

2

あなたがやろうとしていることが不可能である可能性があります。バリデーターの観点からは、XML スキーマは検証しようとしているコントラクトです。ドキュメントがその契約と矛盾している場合、バリデーターはそれを受け入れることができません (そうでなければ、要求に反することになります)。

この XML ドキュメントを本当に受け入れる必要がある場合、バリデーターに受け入れるように指示する方法は、適用しようとしているコントラクト (スキーマ) を変更することです。これを実現する最善の方法は、サード パーティと協力して、サード パーティが提供するスキーマとインスタンス ドキュメントとの間の競合を解決できるようにすることです。これを行わないと、契約を履行しようとする他の誰かがあなたと同じ問題に遭遇することになります.

それが不可能な場合は、インスタンス ドキュメントを検証できるように変更されたローカル スキーマ ファイルを作成することで、システムを回避できます。顧客スキーマをバリデーターにロードする代わりに、代わりの実装をロードしてください。これにより、サードパーティが公式スキーマを更新することなく、ドキュメントを検証できます。ローカル コピーが元のスキーマの変更と同期しなくなる可能性があるため、これは簡単にメンテナンスの問題になる可能性がありますが、このインスタンス ドキュメントのスキーマを変更したくない場合は、スキーマが変更されていない可能性があります。とにかく頻繁に。

于 2012-01-31T05:35:37.443 に答える