- PR -

XMLファイルを読み込んだDataGridにおける「列」の型変換

投稿者投稿内容
aacute
常連さん
会議室デビュー日: 2005/08/25
投稿数: 30
投稿日時: 2005-09-14 00:50
ReadXml()でデータを読む前にDataSetの列定義をしておけば各列の型を設定できます。
もしくは、スキーマを定義したXMLファイルをReadXmlSchema()でDataSetに読み込むこともできます。

スキーマファイルはこの場合ではこんな感じになります。
なおこ(・∀・)さんの作られたXMLを参考に作りました。
コード:
<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:Locale="ja-JP">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="person">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="xs:string" minOccurs="0" />
              <xs:element name="age" type="xs:int" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>



これはDataSetのWriteXmlSchema()メソッドで生成したものです。
手で書いたわけではありません(笑

DataSet.ReadXmlSchema メソッド
http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfSystemDataDataSetClassReadXmlSchemaTopic.asp
DataSet.WriteXmlSchema メソッド
http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfSystemDataDataSetClassWriteXmlSchemaTopic.asp
tutida
会議室デビュー日: 2003/06/05
投稿数: 7
投稿日時: 2005-09-14 11:35
aacuteさん、アドバイス有難う御座います

 C#ではオブジェクト等のシリアル化、デシリアル化にXMLを用いることができるくらいだか

ら、XMLの要素(string型)くらい簡単に変換してくれると思っていたしだいです。

 これを機にXMLを勉強してみようと思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-09-14 21:00
引用:

tutidaさんの書き込み (2005-09-14 11:35) より:

 C#ではオブジェクト等のシリアル化、デシリアル化にXMLを用いることができるくらいだから、XMLの要素(string型)くらい簡単に変換してくれると思っていたしだいです。


むむむ???
型の変換を簡単にやったらいかんでしょ。っていうか、簡単じゃないです。
VB で簡単にできるのは、変換できる型がある程度決まっていますし、だいたい、何を何に変えてよいのかわからないのに、勝手に変えてしまわれると、その方が困ります。
_________________
Atsushi.Eno
ベテラン
会議室デビュー日: 2003/04/23
投稿数: 60
投稿日時: 2005-09-14 22:58
.NET 2.0ではXmlReadMode.InferTypedSchemaというオプションがあるので、まあ簡単に変換してくれると言って良いと思います。

実際、.NET(少なくとも1.x)のDataSet.InferXmlSchema()では、XML文書をXmlDocumentで読み込んで、ツリーのノード全部を辿って、ColumnMappingを、MappingType.SimpleContentであるか、MappingType.Elementであるか、といった推論を行っています。というか、そうしないと、リレーショナルな構造などが正しく推論できないんですね。

で、強い型付けの推論は、SimpleContentな要素であると判断しているノードに対応するDataColumnについて行えば良く、もし途中でSimpleContentではないということになれば、単純に推論を破棄するだけです。.NET 2.0のXmlSchemaInferenceを自分で実装していて感じたことですが(このXmlSchemaInference.csの中のInferSimpleType ()とInferMergedType ()という関数で実装しています)、文字列から型を推論する作業は、リレーショナル構造を推論する作業に比べれば、だいぶ簡単ですよ。

追記: InferXmlSchema()(少なくともそれと同等の機能)は、dataset構造が未定義でXmlReadModeがAutoの場合、ReadXml()の中から呼び出されます。

[ メッセージ編集済み 編集者: Atsushi.Eno 編集日時 2005-09-14 23:01 ]

スキルアップ/キャリアアップ(JOB@IT)