0

複雑な 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」

なにが問題ですか?これは正しいですか (リストに別のスキームを追加します)、または検証を行うために異なるファイルからの同じ名前空間の要素をマージする別の方法がありますか?

ありがとう!

4

1 に答える 1

0

最後に、別の回避策を見つけました。新しいスキーマを追加するのではなく、スキーマを編集します

したがって、XML フラグメント (ノード) が特定の XSD タイプに準拠しているかどうかをテストする必要がある場合は、スキーマを編集して、テストするタイプの ROOT 要素を XML フラグメントのルート要素の名前で追加するだけです。

public static void AddElementToSchema(XmlSchema xmlSchema, string elementName, string elementType, string xmlNamespace)
{
    XmlSchemaElement testNode = new XmlSchemaElement();
    testNode.Name = elementName;
    testNode.Namespaces.Add("", xmlNamespace);
    testNode.SchemaTypeName = new XmlQualifiedName(elementType, xmlNamespace);
    xmlSchema.Items.Add(testNode);
    xmlSchema.Compile(XMLValidationEventHandler);
}

新しくコンパイルされたメモリ スキーマでは、要素がルートになり、正しく検証できます:)

于 2013-10-10T18:17:43.390 に答える