2011-11-30 16 views
10

Quiero salvar registros tomaron de la base de datos en un archivo XML,
toma x número de registros de archivo XML en una colección personalizada List<T>
proceso de ellos y guardar elementos actualizados de nuevo en XML archivo.C# - Guardar lista <T> al archivo XML

'T' es un objeto simple con propiedades de tipo de valor, algo así como -

public class T 
{ 
    public int Id {get; set;} 
    public string property1 {get; set;} 
    public string property2 {get; set;} 
} 

favor me guía cómo puedo guardar colección personalizada List<T> al archivo XML y viceversa?

Además, como no estoy enviando este archivo XML, ¿tiene sentido ir a XmlSerializer como se sugiere en algunas de las respuestas?

¡Gracias!

+0

Depende de 'T' - ¿Tiene algún código de muestra? – BrokenGlass

+0

pregunta editada – iniki

Respuesta

11

Mientras que usted podría utilizar un serializador - y muchas veces esto es la respuesta correcta - yo personalmente uso de LINQ to XML que le permiten ser más flexible en la forma en que su XML debería verse, es decir, crear th e siguiente código XML de una colección foos en función de su clase:

<Foos> 
    <foo Id="1" property1="someprop1" property2="someprop2" /> 
    <foo Id="1" property1="another" property2="third" /> 
</Foos> 

que puede usar:

var xml = new XElement("Foos", foos.Select(x=> new XElement("foo", 
               new XAttribute("Id", x.Id), 
               new XAttribute("property1", x.property1), 
               new XAttribute("property2", x.property2)))); 
2

Utilice la clase XmlSerializer. Desplácese hacia abajo aproximadamente 1/3 del camino para ver los ejemplos.

+0

+1 Vine aquí para decir Serialización también. – Jeremy

+0

porque no estoy enviando este archivo XML, ¿tiene sentido ir a XmlSerializer? – iniki

+1

XMLSerializer le permite convertir un objeto a XML. No tiene nada que ver con "enviar" un archivo. –

13

Aquí son dos métodos que utilizamos para lograr esto mediante el XMLSerializer:

public static T FromXML<T>(string xml) 
{ 
    using (StringReader stringReader = new StringReader(xml)) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(T)); 
     return (T)serializer.Deserialize(stringReader); 
    } 
} 

public string ToXML<T>(T obj) 
{ 
    using (StringWriter stringWriter = new StringWriter(new StringBuilder())) 
    { 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 
     xmlSerializer.Serialize(stringWriter, obj); 
     return stringWriter.ToString(); 
    } 
} 
+2

Y la instancia de T debe tener un constructor sin parámetros. – zionpi

+1

esto no está funcionando – motto

5

Usando el código de abajo (Clase T Tomado de el fragmento de código) usted será capaz de serializar en un archivo XML con facilidad y sin la molestia de implimenting ISerializable

[Serializable()] 
public class T 
{ 
    public int Id {get; set;} 
    public string property1 {get; set;} 
    public string property2 {get; set;} 
} 

... 

List<T> data = new List<T>() 

... // populate the list 

//create the serialiser to create the xml 
XmlSerializer serialiser = new XmlSerializer(typeof(List<T>)); 

// Create the TextWriter for the serialiser to use 
TextWriter filestream = new StreamWriter(@"C:\output.xml"); 

//write to the file 
serialiser.Serialize(filestream , data); 

// Close the file 
fileStream.Close(); 
0
List<BI_QA_ChoiceEntity> choiceSet = new List<BI_QA_ChoiceEntity>(); 
     choiceSet = biEntityObj.ChoiceSet; 

     XmlDocument ChoiceXML = new XmlDocument(); 
     ChoiceXML.AppendChild(ChoiceXML.CreateElement("CHOICESET")); 
     foreach (var item in choiceSet) 
     { 
      XmlElement element = ChoiceXML.CreateElement("CHOICE"); 
      // element.AppendChild(ChoiceXML.CreateElement("CHOICE_ID")).InnerText = Convert.ToString(item.ChoiceID); 
      element.AppendChild(ChoiceXML.CreateElement("CHOICE_TEXT")).InnerText = Convert.ToString(item.ChoiceText); 
      element.AppendChild(ChoiceXML.CreateElement("SEQUENCE")).InnerText = Convert.ToString(item.Sequence); 
      element.AppendChild(ChoiceXML.CreateElement("ISCORRECT")).InnerText = Convert.ToString(item.IsCorrect); 
      ChoiceXML.DocumentElement.AppendChild(element); 
     } 

Pass ChoiceXML al procedimiento almacenado a continuación, SQL Server no como la siguiente

@Choice_XML VARCHAR(MAX)=NULL 

IF(@Choice_XML<>'') 
       BEGIN 
        SET @intDocHandle =0 
        --Create an internal representation of the XML document. 
        EXEC sp_xml_preparedocument @intDocHandle OUTPUT, 

@Choice_XML 

       --SET @ChoiceID = (SELECT max([choice_id])+1 AS 'ChoiceID' from BI_QUESTION_CHOICE) 

       --Insert 
       INSERT BI_QUESTION_CHOICE 
       (
        [choice_id], 
        [choice_descr], 
        [sequence], 
        [question_id], 
        [is_correct], 
        [created_by], 
        [created_dt], 
        [modified_by], 
        [modified_dt] 
       ) 
       SELECT (SELECT max([choice_id])+1 AS 'ChoiceID' from BI_QUESTION_CHOICE), 
        CASE WHEN CHOICE_TEXT='' THEN NULL ELSE CHOICE_TEXT END, 
        CASE WHEN SEQUENCE='' THEN NULL ELSE SEQUENCE END, 
        QuestionID, 
        CASE WHEN ISCORRECT='' THEN NULL ELSE ISCORRECT END, 
        'mbathini', 
        GETDATE(), 
        'mbathini', 
        GETDATE() 
       FROM OPENXML(@intDocHandle,'/CHOICESET/CHOICE', 3) 
       WITH 
       (CHOICE_TEXT VARCHAR(500), 
       SEQUENCE VARCHAR(50), 
       QuestionID INT, 
       ISCORRECT bit) 

END 
-1

Puede guardar su List<T> en una DataTable luego WriteXml

T t0 = new T(); 
     t0.id=1; 
     t0.property1="John"; 
     t0.property2="Doe"; 
    List<T> Tlist = new List<T>(); 
     Tlist.Add(t0); 

    DataTable dt = new DataTable(); 
     dt.TableName = "People"; 
     dt.Columns.Add("ID"); 
     dt.Columns.Add("Name"); 
     dt.Columns.Add("Lastname"); 


     foreach(var item in tlist) 
     { 
      dt.Rows.Add(); 
      dt.Rows[dt.Rows.Count-1]["ID"] = item.name; 
      dt.Rows[dt.Rows.Count - 1]["Name"] = item.id_cod; 
      dt.Rows[dt.Rows.Count - 1]["Lastname"] = item.id_cod; 


     } 
     dt.WriteXml("test.Xml"); 
+0

¿Cómo se relaciona eso con la pregunta? –

+0

¿qué quieres decir? –

+0

Su [respuesta original] (http://stackoverflow.com/revisions/36350950/1) utilizó una clase 'persona' que era muy confusa (no se relacionaba con la pregunta), especialmente que no explicó qué es el código lo hace de cualquier manera.Siempre es mejor proporcionar una explicación general, no solo para pegar el código. –

Cuestiones relacionadas