- PR -

XML Documentのデシリアライズ方法について

1
投稿者投稿内容
misa
会議室デビュー日: 2005/06/17
投稿数: 4
お住まい・勤務地: ebisu
投稿日時: 2005-06-17 15:23
現在、.NET Frameworkを用いてXML Documentのデシリアライズを試みています。
以下が現在の処理内容です。

 Stream fs = new FileStream("ファイルパス",FileMode.Open);
 XmlSerializer xs = new XmlSerializer(typeof(テスト));
 テスト test = (テスト)xs.Deserialize(fs);

テスト classは、.NETのバインディングツールを使用して、XML Schemaから作成したものです。XML Schemaには、ルート要素をテストとし、子要素をA、Aを継承する要素Bを作成しています。
読み込むXML Documentに要素Bを記述し、上記処理内容で実行するとうまくデシリアライズができません。

派生クラスは、デシリアライズできないのでしょうか?
誰か知りませんか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-06-17 21:40
 いろんな人の、いろんな"質問"に書いているのですが、

> 上記処理内容で実行するとうまくデシリアライズができません。
うまくできずにどうなりますか?

 「うまくできない」からは、
   1.エラーになる
   2.エラーは出ないが何も設定されない
   3.何か設定されているが、解読不可能
というようなことが考えられます。または、どれでもないか。

 どれかがわかれば、そのことについて的を絞って考えられます。どれかわからなければ、ほとんどの場合考えることを放棄されます。


 あなたが見ている現象は、あなたにしかわかりません。あなたの見ている現象が、他の人に伝わるように、必要と思われる情報はすべて書き出してください。どれが必要かわからなければ、すべて書き出してください。

参考: http://www.itmedia.co.jp/anchordesk/articles/0506/13/news012.html
書く技術が問われるのは、Blogだけではない
_________________
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-06-17 22:10
マルチサイトポストのクロスリンク

GDNJ
misa
会議室デビュー日: 2005/06/17
投稿数: 4
お住まい・勤務地: ebisu
投稿日時: 2005-06-17 23:25
申し訳ありません。
Jittaさんの言う通りです。情報が不足していました。

以下に処理内容、使用したXMLスキーマファイルとXMLドキュメントの内容を記載します。

--- 処理内容 ---
 Stream fs = new FileStream(XMLドキュメント名, FileMode.Open);
 XmlSerializer xs = new XmlSerializer(typeof(テスト));
 テスト test = (テスト)xs.Deserialize(fs);

 ※テストclassは、.NETバインディングツールを使用して作成したものです。
 ※XMLドキュメント名には、以下に示すXMLドキュメントファイルを指定しました。

--- XMLスキーマファイルの内容 ---
<xs:schema xmlns:tes="http://www.schema.test" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.schema.test" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="テスト">
<xs:complexType>
<xs:sequence>
<xs:element ref="tes:A"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="A" type="tes:A"/>
<xs:complexType name="A">
<xs:sequence>
<xs:element name="A1" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="B" type="tes:B" substitutionGroup="tes:A"/>
<xs:complexType name="B">
<xs:complexContent>
<xs:extension base="tes:A">
<xs:sequence>
<xs:element name="B1" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>

--- XMLドキュメントの内容 ---
<テスト xmlns="http://www.schema.test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.schema.test .\test2.xsd">
<B>
<A1>123456789</A1>
<B1>987654321</B1>
</B>
</テスト>


処理結果ですが、エラーは起こりません。しかし、XMLドキュメントに記述した内容"B"を取得できません。XMLドキュメントの内容を"A"に置き換えると、"A"の内容を取得できます。私には、派生クラスに原因があるように見えるのですが、派生クラスに対しては特別な処理が必要なのでしょうか?それとも別に原因があるのでしょうか?
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-06-18 01:28
まず実際にテスト型のインスタンスを作り、適当に各パラメータを設定して、
それをシリアライズしたXMLを眺めてみて下さい。
派生クラスを扱うときのXMLの書き方が分かるでしょう。
misa
会議室デビュー日: 2005/06/17
投稿数: 4
お住まい・勤務地: ebisu
投稿日時: 2005-06-18 02:52
Hongliangさん返信ありがとうございます。

XmlSerializerにBの存在を教えてあげる必要があったようです。
XMLシリアライズを制御する属性XmlArrayItemAttributeを適用することで、
値の取得ができました。

みなさんありがとうございましたm(_ _)m
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-06-20 22:46
ちょうどXMLにシリアライズするツールを作成していたところなので、補足。

> XmlSerializerにBの存在を教えてあげる必要があったようです。
「INFO: XML シリアル化 の .NET Framework のロード マップ」
「属性を使用した XML シリアル化の制御」
「XML シリアル化を制御する属性」
misa
会議室デビュー日: 2005/06/17
投稿数: 4
お住まい・勤務地: ebisu
投稿日時: 2005-06-22 21:07
Jittaさん

補足情報ありがとうございます。
1

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