2009-09-14 25 views
11

かなり詳細なxmlファイルがあります。以下は、トップレベルのノード(下位レベルのノードはすべてが順調に形成され、適切にデータで満たされているように私には楕円が含まれている)である:XSD生成クラスへのXML逆シリアル化の問題

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <Models>...</Models> 
    <Data>...</Data> 
</config> 

私は、Visual Studio 2008のコマンドプロンプトを使用してからXSDファイルを作成しました:

xsd sample.xml 

これにより、xsdファイルが正常に生成されます。 、私はヘルパークラスで読み取り機能を使用していたクラスのオブジェクトへのXMLファイルの逆シリアル化

xsd sample.xsd /classes 

:私は、自動コマンドでXSDからクラスを生成

public class XmlSerializerHelper<T> 
{ 
    public Type _type; 

    public XmlSerializerHelper() 
    { 
     _type = typeof(T); 
    } 

    public void Save(string path, object obj) 
    { 
     using (TextWriter textWriter = new StreamWriter(path)) 
     { 
      XmlSerializer serializer = new XmlSerializer(_type); 
      serializer.Serialize(textWriter, obj); 
     } 
    } 

    public T Read(string path) 
    { 
     T result; 
     using (TextReader textReader = new StreamReader(path)) 
     { 
      XmlSerializer deserializer = new XmlSerializer(_type); 
      result = (T)deserializer.Deserialize(textReader); 
     } 
     return result; 
    } 
} 

逆シリアル化しようとすると:

var helper = new XmlSerializerHelper<configModels>(); 
var obj = new configModels(); 
obj = helper.Read(filepath); 

を私はデシリアライザが「モデル」ノードが、対応するクラスの名前だったgeneratを探しているされているため、推測したエラーを受け取りますルートノードと「モデル」ノード(configModels)の組み合わせとして定義されています。なぜクラス名はこのように生成されますか?

私が使用して最上位ノードから逆シリアル化しようとした:

var helper = new XmlSerializerHelper<config>(); 
var obj = new config(); 
obj = helper.Read(filepath); 

残念ながら、次のようなエラーのスルーで、この結果:

System.InvalidOperationException was unhandled by user code 
Message="Unable to generate a temporary class (result=1). 
error CS0030: Cannot convert type 'Application.Lease[]' to 'Application.Lease' 
error CS0030: Cannot convert type 'Application.CashFlow[]' to 'Application.CashFlow' 
...ect. 

は、誰かが私がかもしれない方に私を操縦することができます私のxsdの自動生成で間違っているのでしょうか?

+0

自動化されたツールはどれも正しいコードを生成しません。私は、手作業でXMLに逆シリアル化するためのオブジェクトコードを書きました。 –

+0

あなたの問題を解決したと言って以来、marc_sさんの回答に間違いはないと思いますか? – Win

答えて

3

xsd.exeとリストに問題があります。生成されたクラスに移動して、手動でファイルを正しいタイプに編集する必要があります。私はXsd2Codeを使用するように切り替えました。これまでのところ、この問題はないようです。

+0

私はXsd2Codeを試してみましたが、それも私にリストと同じ変換エラーを与えています。 –

+0

xsdファイルをxsdファイルの自動生成に使用しないでください。 –

+0

あなたはそれをうまく使うことができます。生成されたクラスに手を加えて編集するだけです。しかし、Xsd2Codeにも問題があったら、@ marc_sに同意する必要があります。おそらく問題を引き起こしているXMLスキーマ内の何かです。 –

10

XSD.EXEは良いスタートですが、完璧ではありません。また、提供したXMLに基づいて、XSD.EXEは、何かがオブジェクトの単一のインスタンスであるか、オブジェクトのオープンエンドの配列であるかを常に判断することはできません。

これは、2つの要素(Application.LeaseApplication.CashFlow)の場合のようです。生成されたXSDファイルではどのように定義されていますか?それはあなたに理にかなっていますか?恐らく、次のような少しヒント、追加する必要があるだろう:オプションのプロパティの

<xs:element name="Lease" minOccurs="0" maxOccurs="1" /> 

を、それが唯一の0または1の出現箇所です。そのようなことは、xsd.exeツールが単一のXMLサンプルファイルに基づいて把握するのは本当に難しいことです。

マルク・

+1

Marc、あなたがそこにあるお金であなたの解決策が私の問題を解決しました。問題の要素でminOccursとmaxOccursの値を手動で更新し、XSD2CODEを実行してクラスを生成すると、この問題が解決されました。 – ProNotion

10

あなたの生成されたクラスに移動し、すべての変更から[] [] ---> []

+0

これで問題は解決しますが、marc_sの答えは、なぜこれが必要なのか、これを行う必要性を避ける方法を説明します。 – MyItchyChin

0

この問題は、タグ間のXMLファイルの内容は、(意味ということです引き起こす可能性があります別の問題コンテンツではないときにはまだコード化されています)。たとえば、コンテンツの<br>タグは、&lt;br /&gt;ではなく、<br>でした。 xsdジェネレータは、これらをスキーマ内の要素に変換し、複数の要素が見つかったので、無制限にラベルを付けました。コードを解読して問題を修正し、クラスを正しく生成しました。

関連する問題