Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [.NET] Gestire un documento XML

    Non riesco a trovare un modo per fare quanto riportato qui sotto in maniera semplice.

    Ho un'oggetto, anche molto semplice come ad esempio questo:

    codice:
    public class Item { public string Name { get; set; } }
    E ho bisogno di:

    1) Creare il relativo documento XML (serializzazione):

    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <Items>
      <Item Name="Item1"/>
      <Item Name="Item2"/>
    </Items>

    2) Leggere il documento:

    codice:
     
    for each NodeT node in MyXMLDocument
    {
        Item i = new Item(node);
    }
    Il che in pratica corrisponde a deserializzare il documento.

    3) Gestire il documento, quindi per esempio eliminare "Item1", creare "Item3", ed avere la possibilità di modificare gli attributi.

    codice:
     
    <?xml version="1.0" encoding="utf-8"?>
    <Items>
      <Item Name="Item2"/>
      <Item Name="Item3"/>
    </Items>
    Come posso risolvere queste 3 richieste. Grazie.
    Potete rispondere sia in C# che in VB.NET
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536
    Ciao, se vuoi una serializzazione automatica allora devi mettere gli attributi nella classe :
    codice:
        [Serializable]
        [XmlRoot("Item")]
        public class Item
        {
            [XmlAttribute]
            public string Name { get; set; }
            public Item() { }
        }
    
        [Serializable]
        [XmlRoot("Items")]
        public class Items : List<Item>
        {
            public Items() { }
        }
    
    ...
    
            void Main()
            {            
                Items items = new Items();
                items.Add(new Item() { Name = "pippo" });
                items.Add(new Item() { Name = "paperino" });
    
                Serialize("test2.txt", items);
                items = null;
                items = Deserialize("test2.txt");
    
            }
    
            public static bool Serialize(string filename, Items list)
            {
                bool result = false;
                try
                {
                    XmlSerializer x = new XmlSerializer(typeof(Items));
                    using (TextWriter writer = new StreamWriter(filename))
                    {
                        x.Serialize(writer, list);
                    }
                    result = true;
                }
                catch
                {
                    result = false;
                }
                return result;
            }
    
            public static Items Deserialize(string filename)
            {
                Items result = null;
                if (File.Exists(filename))
                {
                    XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(Items));
                    using (Stream strm = File.Open(filename, FileMode.Open))
                    {
                        if (strm.Length > 0)
                        {
                            try
                            {
                                result = (Items)x.Deserialize(strm);
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show(ex.Message);
                            }
                        }
                    }
                }
                return result;
            }
    in questo caso ottieni un xml (che io ho nomimato come txt, ma puoi darli l'estensione xml), come questo :

    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <Items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Item Name="pippo" />
      <Item Name="paperino" />
    </Items>

  3. #3
    Grazie per la tua risposta
    Si, effettivamente al momento sto utilizzando una classe che permette di serializzare e deserializzare il mio oggetto. Tuttavia mi sarebbe piaciuto poter utilizzare una classe appartenente al framework che mi permettesse di gestire facilmente un documento XML (magari LINQ to XML).
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536


    questo è il metodo del framework per serializzare

    Forse devi fare qualcosa di diverso da serializzare? se si allora prova a spiegare...

    Comunque non si tratta di una classe in questo caso, il codice che hai letto era un esempio, la parte che ti serve per serializzare è solo XmlSerializer... più devi utilizzare gli attributi sulla tua classe.

  5. #5
    Quello che mi piacerebbe fare e poter rispondere alle mie 3 richieste utilizzando LINQ TO XML
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  6. #6
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536
    Ok, credo di aver capito cosa intendi, ciò che non capisco è quale sia il ruolo della classe e della serializzazione.
    Mi spiego meglio :
    se tu vuoi manipolare un xml con linq to xml ok, basta che ti leggi il documento xml e usi il metodo XAttribute.Remove per rimuovere attributi o il metodo Add del XElement che stai utilizzando per aggiungerli, ma non credo che questo sia il tuo problema, perchè nel caso ti sarebbe bastato leggerti qualche esempio (google è pieno) o la documentazione msdn. Detto questo, a giudicare dal fatto che hai tirato in ballo la classe e la serializzazione, credo che tu voglia manipolare il file xml, ma poi dopo averlo manipolato utilizzarlo per trasformarlo in un oggetto .NET, quindi deserializzare... ho capito bene?

    ma se è così allora perchè non ti basta la serializzazione classica? perchè dovresti complicarti la vita?

    oppure ciò che vuoi è manipolare ad esempio il numero o il tipo di proprietà della classe?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.