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

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

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

Re[3]: リストボックスにXMLNode[]と表示される


(過去ログ 108 を表示中)

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

■64351 / inTopicNo.1)  リストボックスにXMLNode[]と表示される
  
□投稿者/ もろぞう (6回)-(2012/11/28(Wed) 19:11:04)

分類:[.NET 全般] 

以前よりXMLファイルのデシリアライズで質問させていただいていましたが、
デシリアライズした後にリストボックスに表示をしようとしています。

リストボックスには、TeamクラスをデータソースとしたplayerBindingSourceをバインドしています。

下記のコードを実行するとリストボックスには、player名ではなく
hoge.XmlNode[]
hoge.XmlNode[]
hoge.XmlNode[]
と表示されます。

DataMemberには"player"としているので表示されるかと思ったのですが、
どこが良くないのでしょうか。ご教示よろしくお願いします。


----コード
namespace hoge
{
    public class Team 
    {
       public Players player { get; set; }
    }

    public class Players 
    {
        [XmlElement]
        public ArrayList player { get; set; }
    }

    public Me_Load(object sender, EventArgs e)
    {
        List<Players> player = new List<Players>();
        
        -デシリアライズ処理(略)-

        playerBindingSource.DataSource = readObjXML.team.players;
        playerBindingSource.DataMember = "player";
    }

}
----XMLファイル
<team>
  <players>
    <player>鈴木</player>
    <player>山田</player>
    <player>佐藤</player>
  </players>
</team>

引用返信 編集キー/
■64354 / inTopicNo.2)  Re[1]: リストボックスにXMLNode[]と表示される
□投稿者/ 魔界の仮面弁士 (95回)-(2012/11/28(Wed) 21:07:57)
No64351 (もろぞう さん) に返信
>     public class Team 
>     {
>        public Players player { get; set; }
>     }
>     public class Players 
>     {
>         [XmlElement]
>         public ArrayList player { get; set; }
>     }

どのシリアライザを使っているのか分かりませんが、たとえば上記を
  Team team = new Team() { player = new Players() { player = new ArrayList() { "鈴木", "山田", "佐藤" } } };
  StringBuilder sb = new StringBuilder();
  new XmlSerializer(typeof(Team)).Serialize(new StringWriter(sb), team);
  string xml = sb.ToString();
なコードで『シリアライズ』した場合、XML の内容は
<team>〜</team> ではなく
<Team>〜</Team> となるはずです。

もしも <Team /> ではなく <team /> で管理したいなら、XmlSerializer では
    [XmlRoot(ElementName="team")]
    public class Team
    {
       public Players player { get; set; }
    }
とする必要がありそうです。


>  List<Players> player = new List<Players>();
この変数の用途は何でしょうか?


>  playerBindingSource.DataSource = readObjXML.team.players;
readObjXML という物が何を表しているのか分かりませんが、
少なくとも team クラスに players プロパティはありませんよね。



> ----XMLファイル
> <team>
>   <players>
>     <player>鈴木</player>
>     <player>山田</player>
>     <player>佐藤</player>
>   </players>
> </team>

元のコードとは幾許か異なってしまいますが、たとえば:


//---------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
using System.Xml.Serialization;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        [XmlRoot(ElementName = "team")]
        public class Team
        {
            public Players player { get; set; }
        }

        public class Players
        {
            [XmlElement]
            public ArrayList player { get; set; }
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            List<Team> player = new List<Team>();

            #region "デシリアライズ"
            string xml = @"<?xml version='1.0' encoding='utf-16'?>
<team xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
      xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
  <player>
    <player xsi:type='xsd:string'>鈴木</player>
    <player xsi:type='xsd:string'>山田</player>
    <player xsi:type='xsd:string'>佐藤</player>
  </player>
</team>";

            Team team = null;
            using(StringReader stm = new StringReader(xml))
            {
                XmlSerializer ser = new XmlSerializer(typeof(Team));
                team = (Team)ser.Deserialize(stm);
                stm.Close();
            }
            #endregion

            bindingSource1.DataSource = team.player;
            bindingSource1.DataMember = "player";
            listBox1.DataSource = bindingSource1;
        }
    }
}

引用返信 編集キー/
■64355 / inTopicNo.3)  Re[2]: リストボックスにXMLNode[]と表示される
□投稿者/ 魔界の仮面弁士 (96回)-(2012/11/28(Wed) 21:37:14)
No64354 (魔界の仮面弁士) に追記

少し補足:

単に ArrayList のままだと、メンバーは object 型として扱われます。
XML 側で xsi:type='xsd:string' などと定義されていない場合、
デシリアライズ時には String ではなく、System.Xml.XmlNode[] となってしまいます。


もしも、元の XML 側に
>     <player xsi:type='xsd:string'>鈴木</player>
のような型定義を含めず、
>>    <player>鈴木</player>
のままにしておきたいなら、
    public class Players
    {
        [XmlElement]
        public List<string> player { get; set; }
    }
あるいは、
    public class Players
    {
        [XmlElement(typeof(String))]
        public ArrayList player { get; set; }
    }
のようにして、クラス側でメンバーの型を明示してみてください。

引用返信 編集キー/
■64369 / inTopicNo.4)  Re[3]: リストボックスにXMLNode[]と表示される
□投稿者/ もろぞう (7回)-(2012/11/29(Thu) 16:39:57)
魔界の仮面弁士さん

ご回答ありがとうございます。
結果、[XmlElement(typeof(String))]で希望の処理が出来ました。
クラス側で型を明示的に指定するという考えは全く思いつきませんでした。


> なコードで『シリアライズ』した場合、XML の内容は
> <team>〜</team> ではなく
> <Team>〜</Team> となるはずです


Teamはルートではなく、階層の途中の抜粋したクラスでしたので、

public class League
{
   public Team team { get; set; }
}
のようにして使用しています。説明不足ですいません。


> >  List<Players> player = new List<Players>();
> この変数の用途は何でしょうか

これは色々試行錯誤していた中の残骸で。。。(しかも、player→playersです。。)

実は当初、1行を1teamとして、1列目にチームID、2列目にチーム名、3列目をコンボボックスにして選手名を表示することが目的でした。

3列目のコンボボックス列に、ジェネリック型の可変長リスト(リスト型のリスト?)をバインドしようとしていました。
ですが、いまいち理解できなかったので、まずはリストボックスに単一リストを表示することを試していました。

その時は、例外処理のエラーや文字列ではなく文字長さが表示されたり・・・色々ぶつかって混乱していたので
まずはplayersをリストボックスに表示できるようにしてから・・・と考えてこの質問になりました。

また壁にぶつかったので別スレで質問させていただきます。
よろしくお願いします。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -