Je veux sauvegarder les enregistrements extraits de la base de données dans un fichier XML,
prendre x nombre d'enregistrements d'un fichier XML dans une collection personnalisée List<T>
les traiter et enregistrer les éléments mis à jour dans un fichier XML.
'T' est un objet simple avec des propriétés de type valeur, quelque chose comme -
public class T
{
public int Id {get; set;}
public string property1 {get; set;}
public string property2 {get; set;}
}
S'il vous plaît, guidez-moi. Comment puis-je enregistrer la collection personnalisée List<T>
dans un fichier XML et inversement?
De plus, comme je n'envoie pas ce fichier XML, est-il judicieux de choisir XmlSerializer comme suggéré dans certaines des réponses?
Bien que vous puissiez utiliser un sérialiseur (ce qui est souvent la bonne réponse), j’utiliserais personnellement Linq to XML, ce qui vous permettrait d’être plus souple quant à la structure de votre code XML, c’est-à-dire de créer le code XML suivant à partir d’une collection basée sur foos
. sur votre classe:
<Foos>
<foo Id="1" property1="someprop1" property2="someprop2" />
<foo Id="1" property1="another" property2="third" />
</Foos>
Vous pouvez utiliser:
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))));
Voici deux méthodes que nous utilisons pour accomplir cela en utilisant 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();
}
}
En utilisant le code ci-dessous (Classe T extraite de votre extrait de code), vous pourrez vous sérialiser dans un fichier xml avec facilité et sans les tracas d'implémenter 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();
Utilisez le XmlSerializer class. Faites défiler vers le bas environ 1/3 du chemin pour les exemples.
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);
}
Passez la procédure ChoiceXML à la procédure stockée, puis SQL Server Procédez comme ci-dessous
@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