複雑な XSD ファイルに準拠した XML ファイルを作成する必要があります。私のアプローチは、XSD のすべてのタイプを (TDD を使用して) 段階的に検証することです。ルート要素しか検証できないので、私がやっていることは
- テスト対象の複合型の「TestNode」というルート要素のみを使用して、同じ名前空間に新しいスキーマを作成します。
- スキーマ検証リストにスキーマを追加します
つまり、これは元の複雑なスキーマの一部です
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns="urn:FooSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:FooSchema">
<xs:element name="Document" type="Document"/>
<xs:complexType name="AComplexType">
<xs:sequence>
<xs:element name="MsgId" type="Max35Text"/>
...
</xs:complexType>
...
...
<xs:element name="OriginalElement" type="AComplexType"/>
...
...
</xs:schema>
「AComplexTypeFormat」形式の XML ノードを作成して検証したいのですが、「OriginalElement」はルート要素ではないため検証できません。
元の XSD ファイルを変更することは許可されていません。したがって、私の回避策は、アクセサリ NodeTester XSD ファイルを作成することです。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element xmlns="urn:FooSchema" name="TestNode" type="AComplexType" />
</xs:schema>
次に、両方のスキーマを検証リストに追加します
XmlSchema originalSchema = XmlSchema.Read(new StreamReader("ComplexSchema.xsd"), XMLValidationEventHandler);
XmlSchema testingSchema = XmlSchema.Read(new StreamReader("NodeTester.xsd"), XMLValidationEventHandler);
XmlReaderSettings validatorSettings = new XmlReaderSettings();
validatorSettings.Schemas.Add(originalSchema);
validatorSettings.Schemas.Add(testingSchema);
validatorSettings.ValidationType = ValidationType.Schema;
validatorSettings.ConformanceLevel = ConformanceLevel.Fragment;
validatorSettings.ValidationEventHandler += new ValidationEventHandler(XMLValidationEventHandler);
XmlReader validationReader = XmlReader.Create(new StringReader(stringXML), validatorSettings);
while (validationReader.Read()) { }
XML ノードを含む stringXML を検証すると、エラーが表示されます (スペイン語からの翻訳で申し訳ありません)。
The element 'TestNode' has a secondary element 'MsgId' not valid. Expected list of possible elements: 'MsgId' in the namespace 'urn:FooSchema'.
不可解 :( バリデータが待機しているため、「MsgID」は許可されません...「MsgID」
なにが問題ですか?これは正しいですか (リストに別のスキームを追加します)、または検証を行うために異なるファイルからの同じ名前空間の要素をマージする別の方法がありますか?
ありがとう!