2011-08-08 4 views
1

xmlスキームからxsd-toolを使用してcs-classesを生成しました。 スキームは、umlクラスの記述から生成される非常に複雑なスキームです。 ここでは、生成されたxsdクラスの機能を保証するための簡単なテストを作成しました。 テストではXmlSerializerを使用してxmlファイルを作成します。すべての必須要素を作成する強制によるXMLシリアル化の方法

私のXSDスキームには、いくつかの義務的な要素があります(xsd-defaultによるとminocc=1maxocc=1という定義があります)。例えば

(簡体字):

<xs:element name="order"> 
    <xs:complexType> 
     ... 
     <xs:element name="orderId" type="string"/> 
     <xs:element name="material" type="Material"/> 
     ... 
    <xs:complexType> 

材料は、いくつかの要素で構成されて複合型です。それは注文の一部です。

これらの要素は、空の要素または空の要素のみを含む場合でも、結果のXMLファイルに常に存在する必要があります。ここで、クラスインスタンスをxmlファイルにシリアル化すると、class-propertysに値が含まれている要素だけが表示されます。 orderIdを設定した場合、orderId要素は表示されますが、class要素のインスタンスではnullですので、material要素は表示されません。その結果、私のxml-fileはxsd-schemaに対して有効ではありません。

シリアル化中に結果のxmlファイルをxsdファイルで検証する方法がありますか? XmlSerializerには常に必須の要素(おそらくデフォルト値)を生成するべきであると伝える方法はありますか? または、シリアル化するクラスインスタンスの構造を検証する方法がありますか?

+0

いつも 'null'以外の値を指定できますか? –

+0

私が持っている問題は、xsd-schemaとその結果のクラス構造が非常に複雑で、必要のないすべてのプロパティを設定したくないということです。 – martin

+0

しかし確かにxsdはあなたに彼らが*必要とされていることを伝えています... –

答えて

2

必要なルールを満たすために自動的に要素を生成することはできません。 2番目の質問では、生成されたXMLをXmlReaderおよびXmlSchemaオブジェクトで検証できます。 小さな例では、次のようになります。

 public IList<string> Validate(TextReader reader, XmlSchema schema) 
     { 
      XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.Schemas.Add(schema); 
      settings.ValidationType = ValidationType.Schema; 

      List<string> errors = new List<string>(); 

      settings.ValidationEventHandler += (sender, e) => 
      { 
       errors.Add(string.Format("Line {0} at position {1}{2}{3}", 
         e.Exception.LineNumber, e.Exception.LinePosition, 
            Environment.NewLine, e.Message)); 
      }; 


      XmlReader xmlReader = XmlReader.Create(reader, settings); 
      while (xmlReader.Read()) { }; 

      return errors; 
     } 

この例は、したTextReader(StreamReaderを、にStringReaderなどすることができます)とXMLSchemaオブジェクトを取る(あなたはXSDファイルまたは任意のものを構築することができます - マニュアルを確認しますそのために)、検証エラーのリストを返します。

関連する問題