2011-01-12 11 views
0

膨大な数の要素および関連する属性を表すXSDファイルが提供されています。 xsd.exeを使用してCSクラスを作成しました。可変XML要素を使用したXSDからのXMLの逆シリアル化

作成されるxmlには、任意の要素またはすべての要素と属性を含めることができます。

例XML:

<App action="A" id="1" validate="yes"><ProductType id="5885"/><SpecType id="221"/><Qty>1</Qty><PartType id="7212"/><Part>456789</Part></App> 
<App action="A" id="2" validate="yes"><ProductType id="5883"/><Qty>1</Qty><PartType id="7211"/><Part>132465</Part></App> 

そして、私のコードで:

protected static void ImportProduct(string filename) 
{ 
var counter = 0; 
var xSerializer = new XmlSerializer(typeof(ProductList)); 
var fs = new FileStream(String.Format("{0}{1}", FilePath, filename), FileMode.Open); 
var reader = XmlReader.Create(fs); 
var items = (ProductList)xSerializer.Deserialize(reader); 

foreach (var record in items.App) 
{ 
    counter++; 

    Console.Write(String.Format("{0}{1}", record.ProductType.id, Environment.NewLine)); 
    Console.Write(String.Format("{0}{1}", record.Part.Value, Environment.NewLine)); 

    *if (!record.SpecType.Value.Equals(null)) 
     Console.Write(String.Format("{0}{1}", record.SpecType.id, Environment.NewLine)); 
    else 
     Console.Write(String.Format("{0}{1}", "No SpecType!", Environment.NewLine)); 

    if (counter == 10) 
     break; 
} 

}

だから私の質問は、私があたり、空/存在しない要素をチェックすることができる方法です上の星印(*)の行

xsdまたはソースXMLファイルは、大手メーカーが製造しているため、変更できません。

詳細情報が必要な場合はお知らせください。

ありがとうございます! Brad

+0

問題が何ですか? xsdはSpecTypeに対して 'minOccurs = "0"'を返します。つまり、xsd.exeによって生成されたオブジェクトには、null可能なSpecType(int ?, stringなど)が含まれていますか?もしそうなら、あなたの(*)回線はなぜ機能しませんか?例外/問題とは何ですか? xsdで 'minOccurs = "0"'と表示されない場合、デシリアライゼーションがクラッシュすることが予想されます。 –

+0

こんにちはMartin:。なぜそれがその行で壊れているのか分かりません。それはすべきだと思われますが、おそらくそれは私が働いていない構文です... –

答えて

1

申し訳ありませんが、XSD.EXEとXMLシリアライゼーションはそのようなXMLを扱うつもりはありません。

人間が読んでタイプするのは簡単だと人間が考えているので、その性質のXMLが作成されます。マシンはそれらを使用できるかどうかは考えません。あなたが今支払う必要がある間違いです。

要素を標準的な順序で配置し、その順序を表すXSDを作成し、XSDからクラスを作成するXSLTを作成するのが最善の方法です。

+0

同意する。データバインディングは、単純な通常のスキーマでうまく機能します。スキーマが大きくなればなるほど、データが「半構造化」されるほど、データバインディングを使用するのが面倒で煩雑になります。 XSLTとXQueryは、この種のデータの処理にはるかに適しています。 –

+0

OK、非常に良い、みんな、ありがとう。私はこの答を、私がしなければならない方向の変化のためだけに投票しています。これは、開発者以外のすべての人に相談したソリューションの1つです。 –

0

XSDを取得したら、XMLリーダーの代わりにデータセットを使用できます。次に、以下の例に示すように、nullをチェックするために作成されたいくつかの自動メソッドがあります。

など。これは、CalcualtionAnalysisDSがXSDである場合の例です。

 CalcualtionAnalysisDS ds = new CalcualtionAnalysisDS(); 
     ds.ReadXml("calc.xml"); 

     foreach (CalcualtionAnalysisDS.ReportRow row in ds.Report.Rows) 
     { 
      if (row.IsBestSHDSLDesignClassNull) 
      { 

      } 
     } 
+0

こんにちはdarwindave、答えに感謝します。 MSDataSetGeneratorを利用しようとすると、「カスタムツールエラー:コードを生成できませんでした。未定義のデータ型: 'token'」というメッセージが表示されました。だから、これは上記の私のポストとは別の無関係のエラーのように聞こえるが、それについてのいかなる考え?私もxsd.exe file.xsd/dと同じ結果を試しました。 - Brad –

+0

私は通常、自分のXSDをVisual Studioにドラッグアンドドロップするだけで、コードが自動的に作成されます。 xsdを使ってxsdを作成しようとすると、xsdが正しいかどうかを再確認できます。 "C:¥Program Files¥Microsoft SDKs¥Windows¥v7.0A¥bin¥xsd" Something.xml/l:CS/classes /uri:http://something.com/xml/something/l:CS – darwindave

関連する問題