- - PR -
XML Documentのデシリアライズ方法について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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を記述し、上記処理内容で実行するとうまくデシリアライズができません。 派生クラスは、デシリアライズできないのでしょうか? 誰か知りませんか? |
|
投稿日時: 2005-06-17 21:40
いろんな人の、いろんな"質問"に書いているのですが、
> 上記処理内容で実行するとうまくデシリアライズができません。 うまくできずにどうなりますか? 「うまくできない」からは、 1.エラーになる 2.エラーは出ないが何も設定されない 3.何か設定されているが、解読不可能 というようなことが考えられます。または、どれでもないか。 どれかがわかれば、そのことについて的を絞って考えられます。どれかわからなければ、ほとんどの場合考えることを放棄されます。 あなたが見ている現象は、あなたにしかわかりません。あなたの見ている現象が、他の人に伝わるように、必要と思われる情報はすべて書き出してください。どれが必要かわからなければ、すべて書き出してください。 参考: http://www.itmedia.co.jp/anchordesk/articles/0506/13/news012.html 書く技術が問われるのは、Blogだけではない _________________ |
|
投稿日時: 2005-06-17 22:10
マルチサイトポストのクロスリンク
GDNJ |
|
投稿日時: 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"の内容を取得できます。私には、派生クラスに原因があるように見えるのですが、派生クラスに対しては特別な処理が必要なのでしょうか?それとも別に原因があるのでしょうか? |
|
投稿日時: 2005-06-18 01:28
まず実際にテスト型のインスタンスを作り、適当に各パラメータを設定して、
それをシリアライズしたXMLを眺めてみて下さい。 派生クラスを扱うときのXMLの書き方が分かるでしょう。 |
|
投稿日時: 2005-06-18 02:52
Hongliangさん返信ありがとうございます。
XmlSerializerにBの存在を教えてあげる必要があったようです。 XMLシリアライズを制御する属性XmlArrayItemAttributeを適用することで、 値の取得ができました。 みなさんありがとうございましたm(_ _)m |
|
投稿日時: 2005-06-20 22:46
ちょうどXMLにシリアライズするツールを作成していたところなので、補足。
> XmlSerializerにBの存在を教えてあげる必要があったようです。 「INFO: XML シリアル化 の .NET Framework のロード マップ」 「属性を使用した XML シリアル化の制御」 「XML シリアル化を制御する属性」 |
|
投稿日時: 2005-06-22 21:07
Jittaさん
補足情報ありがとうございます。 |
1