Avatar
no.good
Člen
Avatar
no.good:

Ahoj, chci se zeptat, jestli je možné vytvořit instance tříd nějakého objektu dle definice v xml souboru a také naplnění této instance vlastnostmi, které jsou definovány také v tomto souboru. Níže posílám příklad:

Definice třídy, ze které mají být dynamicky vytvořeny instance

class ClassFromXml
    {
        public string name;
        public string surname;
    }

XML definiční soubor[settin­gs.xml], který definuje, jaké instance se mají vytvořit
<instance> znamená vždy jednu instanci pro danou třídu
<instancename> název instance, který se má použít pro vytvoření
<name> a <surname> jsou vlastnosti, které mají být použity vždy v dané třídě

<?xml version="1.0" encoding="utf-8" ?>
<objects>
  <instance>
    <instancename>inst1<instancename>
    <name>Peter</name>
    <surname>Novak</surname>
  </instance>
  <instance>
    <instancename>inst2<instancename>
    <name>Ludmila</name>
    <surname>Modra</surname>
  </instance>
</objects>

Definice třídy, která vytváří instance podle definice v XML souboru

class ClassLoader
    {
        public void LoadClasses()
        {
            XmlDocument xml = new XmlDocument();
            xml.Load(@"settings.xml");

            XmlNodeList nodes = xml.SelectNodes("/objects/instance");

            foreach (XmlNode node in nodes)
            {
                //"node.FirstChild.InnerText" je název nové instance třídy ClassFromXml - inst1, inst2, atd..
                // měly by se vytvořit cyklem
                ClassFromXml node.FirstChild.InnerText = new ClassFromXml();
                node.FirstChild.InnerText.name = node.ChildNodes[1].InnerText;
                node.FirstChild.InnerText.surname = node.ChildNodes[2].InnerText;
            }
        }
    }

Podle výše uvedeného programu by se měly vytvořit dvě instance:
inst1 s vlastnostmi name->Peter a surname->Novak
inst2 s vlastnostmi name->Ludmila a surname->Modra

Snad jsem to popsal dostatečně jasně :)

Předem díky za pomoc

 
Odpovědět 15.2.2015 19:34
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na no.good
Jan Vargovský:

Jména instance dynamicky nevytvoříš.

Jediné co mě napadá je Dictionary<string, ClassFromXml>.

Editováno 15.2.2015 20:02
 
Nahoru Odpovědět 15.2.2015 20:00
Avatar
Odpovídá na no.good
sadlomaslox25:

kdyz si pohrajes se serializaci tak muzes napsat:

[XmlRoot("objects")]
public partial class Data
{
    [XmlElementAttribute("instance")]
    public InnerData[] Instance { get; set; }
}

public partial class InnerData
{
    [XmlElement("instancename")]
    public string InstanceName { get; set; }

    [XmlElement("name")]
    public string Name { get; set; }

    [XmlElement("surname")]
    public string Surname { get; set; }
}

a pak se to ovlada pres:

var serializer = new XmlSerializer(typeof (Data));
var deserializedData=serializer.Deserialize(new StringReader(inputString)) as Data;

var emptyNS = new XmlSerializerNamespaces();
emptyNS.Add("", "");
var stringWriter = new StringWriter();
serializer.Serialize(stringWriter, deserializedData, emptyNS);
var outputString = stringWriter.ToString();

Dictionary<string, InnerData> dictionary = deserializedData.Instance.ToDictionary(o => o.InstanceName);
InnerData instance1 = dictionary["inst1"];
 
Nahoru Odpovědět 15.2.2015 20:04
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.