2012-01-05 16 views
3

2つの文字列があります。 1つの文字列はXMLデータを持ち、もう1つの文字列は対応するXMLスキーマを持っています。私はDataTableでデータを読み込もうとしています。それは不可能であるように見えます。私はデータセットを使いたくない。 XMLデータとスキーマをメモリストリームに結合して読み込む方法はありますか?DataTableのReadXMLデータとスキーマ

+0

DaraTable /データセットは、独自のスキーマではなく、あなたが一緒に持って来るものを理解しています。スキーマなしで試してみてください。 –

+0

DataSetはスキーマなしでデータを読み取ることができるようです。しかし、私はdatatableとしようとしたときに私は次のエラーが発生しました。 DatatableはXMLからのスキーマの推論をサポートしていません。 –

+0

"DataSetはデータを読み取ることができます" - 問題は解決しましたか? –

答えて

4

DataTableのメソッドを使用してxmlをDataTableに直接ロードする方法も、任意のスキーマから直接DataTableを作成する方法もありません。このような操作は、DataSetを使用して行う必要があります。そうしないと、非常に複雑な回避策を実行することになります。

以前にシリアル化されたXMLからデータセットを再作成できるxmlシリアル化を使用して適用できるいくつかの手法があります。これは任意のスキーマの使用を考慮していません。

XMLを(XDocument、XmlDocument、またはXmlTextReader経由で)読み込み、その場でDataTableを作成するコードを書くこともできますが、書くのは簡単ではなく、かなり時間がかかります。それはまた、ホイールの再発明のようなものです。

Xmlに任意の数のテーブルを含めることができるため、基本的に、DataSetはその階層内のXMLを処理するメソッドを持つ唯一のクラスです。 XMLについてほとんど想定することができない場合の最も広範なケースを処理するには、そのレベルで実装する必要があります。

xmlをXDocumentにロードし、Validate拡張メソッドを使用して検証し、Linq to Xmlを使用して検証することが適切かどうかを検討することもできます。

3

私はXMLデータとスキーマをメモリに結合して ストリームと読み込む方法はありますか?


方法

 static DataTable ParseXML(string xmlString) 
    { 
     DataSet ds = new DataSet(); 
     byte[] xmlBytes = Encoding.UTF8.GetBytes(xmlString); 
     Stream memory = new MemoryStream(xmlBytes); 
     ds.ReadXml(memory); 
     return ds.Tables[0]; 
    } 

例:

  string xml = new XElement("inventory", 
       new XElement("item", 
        new XElement("name", "rock"), 
        new XElement("price", "5000")), 
       new XElement("item", 
        new XElement("name", "new car"), 
        new XElement("price", "1"))).ToString(); 

      DataTable dt = ParseXML(xml); 
      foreach (DataRow row in dt.Rows) 
      { 
       foreach (DataColumn col in dt.Columns) 
        Console.Write(row[col.ColumnName] + " | "); 

       Console.WriteLine(); 
      } 
関連する問題