1

xml ファイルから文字列をキャストして ContactPersonType にキャストしたい

文字列をキャストする必要がある場所については、for ループを参照してください

public class ContactPersonType
{
    private String _id;
    public String ID
    {
        get { return _id; }
        set { _id = value; }
    }

    private String _name;
    public String Name
    {
        get { return _name; }
        set { _name = value; }
    }
}

//ContactPerson クラス

private ContactPersonType _jobRole;
        public ContactPersonType JobRole
        {
            get { return _jobRole; }
            set { _jobRole = value; }
        }


public static ObservableCollection<ContactPerson> getContactPerson()
        {
            ObservableCollection<ContactPerson> ContactPersons = new ObservableCollection<ContactPerson>();
            XmlDocument doc = new XmlDocument();
            doc.Load("contactpersoon.xml");

            XmlNodeList elemList = doc.GetElementsByTagName("contact");
            for (int i = 0; i < elemList.Count; i++)
            {
                 //this needs to be casted to ContactPersonType
                contactPerson.JobRole = elemList[i]["jobrole"].InnerText;
            }
            return ContactPersons;
        }
4

2 に答える 2

0

以下に示すようなヘルパーを使用して、XML を .NET クラスに逆シリアル化できませんか?

public T Deserialize<T>(string fileName)
        {
            try
            {           
                XmlSerializer sx = new XmlSerializer(typeof(T)); //or T.GetType?
                StreamReader sr = new StreamReader(fileName);
                var data = sx.Deserialize(sr);
                sr.Close();

                return (T)data;
            }
            catch (Exception ex)
            {

                throw;
            }
        }

私は XmlDocument が嫌いなので、可能な場合は常に逆シリアル化します (ただし、私が好きな代わりになる可能性があるのはXDocument です)。

編集 - 使用法は次のようになります。

var item = Deserialize<ContactPersonType>(fileName);
于 2013-11-11T14:30:00.230 に答える
0

私はあなたが XML 要素を読む方法にあまり慣れていないので、このコードを微調整する必要があるかもしれませんが、これはあなたが探しているものに沿っているはずです (コードの読みやすさを向上させるために、プロパティを自動実装する自由もありました)

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Xml;
using System.Xml.Linq;

namespace Program
{
    public class ContactPersonType
    {
        public string ID { get; set; }
        public string Name { get; set; }
    }

    public class ContactPerson
    {
        public ContactPersonType JobRole { get; set; }

        public static ObservableCollection<ContactPerson> GetContactPerson()
        {
            var contactPersons = new ObservableCollection<ContactPerson>();
            XElement doc = XElement.Load("contactpersoon.xml");
            var contacts = doc.Elements("contact");

            for (int i = 0; i < contacts.Count(); i++)
            {
                contactPersons.Add(new ContactPerson
                {
                    JobRole = new ContactPersonType
                    {
                        ID = i.ToString(),
                        Name = contacts.ElementAt(i).Element("jobrole").Value
                    }
                });
            }

            return contactPersons;
        }
    }
}

ID プロパティの設定方法によっては、ループを foreach として書き直すことができます。XElement とそのメンバーの詳細については、http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement(v=vs.110).aspxおよびhttp://msdnを参照してください。 microsoft.com/en-us/vstudio/bb688087.aspx

于 2013-11-11T14:41:27.143 に答える