C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: XmlSerializerについて


(過去ログ 48 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■26371 / inTopicNo.1)  XmlSerializerについて
  
□投稿者/ とんとん (1回)-(2008/10/07(Tue) 21:56:50)

分類:[VB.NET/VB2005 以降] 

お世話になっています。
vb.net2008でXmlSerializerを使ってXMLの読み込みに挑戦している所なのですが、次の所で困っています。

<?xml version="1.0"?>
<XmlSerializerClass>
<itemC>
<no>1</no>
<name>test</name>
<Class1>
<itemsC>aa</itemsC>
</Class1>
<Class1>
<itemsC>bb</itemsC>
</Class1>
</itemC>
</XmlSerializerClass>

'--------------------------------------------
<XmlSerializerClass>タグの中に
 <itemC>タグが1〜* 

<itemC>タグの中に
 <no>タグが必ず1つ
 <name>タグが必ず一つ
 <Class1>タグが0〜*
この時クラスをどういう風に作成すればいいのか分りません。
'---------------------------------------------

Public Class XmlSerializerClass
Public itemC() As Class1
End Class
と書くと<no>と<name>を読込むことができませんし・・・


よろしくお願いします。
引用返信 編集キー/
■26373 / inTopicNo.2)  Re[1]: XmlSerializerについて
□投稿者/ Hongliang (297回)-(2008/10/07(Tue) 23:00:15)
基本的に、XmlSerializer は「オブジェクトを XML で永続化する」ものです。既存の XML をオブジェクトに読み込ませるにはあまり向きません。
この場合、XmlDocument で読み込ませて普通にオブジェクトを構築していくほうが多分効率的です。

> <itemC>タグの中に
>  <no>タグが必ず1つ
>  <name>タグが必ず一つ
>  <Class1>タグが0〜*

> <Class1>
> <itemsC>aa</itemsC>
> </Class1>

すごく矛盾してますね。
引用返信 編集キー/
■26375 / inTopicNo.3)  Re[2]: XmlSerializerについて
□投稿者/ なちゃ (178回)-(2008/10/07(Tue) 23:26:02)
スキーマ生成ツール(VSか何かでできなかったっけかな?)でスキーマ作って手直しして
xsd.exeだったか使ったらそれっぽいのはできるかも。
無責任モードですが。

引用返信 編集キー/
■26376 / inTopicNo.4)  Re[3]: XmlSerializerについて
□投稿者/ Hongliang (298回)-(2008/10/07(Tue) 23:30:08)
>> <itemC>タグの中に
>>  <no>タグが必ず1つ
>>  <name>タグが必ず一つ
>>  <Class1>タグが0〜*

>> <Class1>
>> <itemsC>aa</itemsC>
>> </Class1>

>すごく矛盾してますね。

しまった、よく見ると間違ってなかった。
でもこの要素名はどうかと思います。
引用返信 編集キー/
■26381 / inTopicNo.5)  Re[1]: XmlSerializerについて
□投稿者/ れい (814回)-(2008/10/08(Wed) 00:32:20)
No26371 (とんとん さん) に返信
> この時クラスをどういう風に作成すればいいのか分りません。

Hongliangさんの言うとおり、シリアル化のためにあるのでそれ以外の用途に使うのはかなり大変です。
全くオススメできませんが、
どうしてもXmlSerializerで読む必要があるのなら、
シリアル化対象クラス(今回はXmlSerializerClass)にIXmlSerializableインタフェースを実装させます。

XmlSerializerの標準の処理だと、
同じ名称の要素が並列に複数出てくるのはコレクションの場合だけで、
その場合、他の名称の要素を同列に並べることができません。
IXmlSerializable.ReadXml、WriteXmlで振る舞いを変更するとできると思います。

大抵の場合はXmlReaderやXmlDocumentで読み込んだ方が楽だと思います。



引用返信 編集キー/
■26385 / inTopicNo.6)  Re[2]: XmlSerializerについて
□投稿者/ Hongliang (299回)-(2008/10/08(Wed) 09:36:59)
> XmlSerializerの標準の処理だと、
> 同じ名称の要素が並列に複数出てくるのはコレクションの場合だけで、
> その場合、他の名称の要素を同列に並べることができません。

やー、まあその辺は属性の付け方次第でかなりどうとでもできますが。
引用返信 編集キー/
■26433 / inTopicNo.7)  Re[3]: XmlSerializerについて
□投稿者/ れい (815回)-(2008/10/08(Wed) 20:49:21)
No26385 (Hongliang さん) に返信
>>XmlSerializerの標準の処理だと、
>>同じ名称の要素が並列に複数出てくるのはコレクションの場合だけで、
>>その場合、他の名称の要素を同列に並べることができません。
>
> やー、まあその辺は属性の付け方次第でかなりどうとでもできますが。

なんと。
知りませんでした。
やり方を教えていただけますか?

引用返信 編集キー/
■26437 / inTopicNo.8)  Re[4]: XmlSerializerについて
□投稿者/ Hongliang (300回)-(2008/10/08(Wed) 22:13:05)
例えば、こんなクラス定義なら
class AAA {
public int Id { get; set; }
[XmlElement("BBB")] public BBB[] Values { get; set; }
}
class BBB {
public string Name { get; set; }
}

こうなります。

<AAA>
<Id>0</Id>
<BBB><Name>Hoge</Name></BBB>
<BBB><Name>Huga</Name></BBB>
</AAA>
引用返信 編集キー/
■26438 / inTopicNo.9)  Re[5]: XmlSerializerについて
□投稿者/ れい (816回)-(2008/10/08(Wed) 22:18:12)
No26437 (Hongliang さん) に返信
> 例えば、こんなクラス定義なら
> class AAA {
> public int Id { get; set; }
> [XmlElement("BBB")] public BBB[] Values { get; set; }
> }
> class BBB {
> public string Name { get; set; }
> }
>
> こうなります。
>
> <AAA>
> <Id>0</Id>
> <BBB><Name>Hoge</Name></BBB>
> <BBB><Name>Huga</Name></BBB>
> </AAA>

そんな簡単に…。

前調べた時は何か問題があって、できないという結論になっていたんですが。
どこかで記憶違いをしてたようです。
大うそつきですね。

ってことはこれでとんとんさんの問題は解決できそうですね。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -