2011-11-30 8 views
10

मैं एक XML फ़ाइल में डेटाबेस से दिलवाया रिकॉर्ड बचाना चाहते हैं, एक कस्टम संकलन में XML फ़ाइल से रिकॉर्ड की
ले एक्स संख्या List<T>
प्रक्रिया और अपडेट किए गए आइटम एक्सएमएल में वापस बचाने के फ़ाइल।सी # - उन्हें एक्सएमएल फ़ाइल सूची <T> सहेजें

'टी' मान प्रकार गुण, कुछ तरह के साथ एक सरल वस्तु है -

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

कृपया मुझे गाइड कैसे मैं एक्सएमएल फ़ाइल और उपाध्यक्ष प्रतिकूल करने के लिए कस्टम संग्रह List<T> बचा सकता है?

इसके अलावा, क्योंकि मैं इस एक्सएमएल फ़ाइल को नहीं भेज रहा हूं, क्या कुछ जवाबों में सुझाव के अनुसार XmlSerializer के लिए जाना समझदारी होगी?

धन्यवाद!

+0

यह 'टी' पर निर्भर करता है - कुछ नमूना कोड मिला? – BrokenGlass

+0

प्रश्न संपादित – iniki

उत्तर

11

आप एक serializer इस्तेमाल कर सकते हैं जबकि की परेशानी के बिना जैसा दिखना चाहिए, यानी वें बनाना ई एक संग्रह foos अपने वर्ग के आधार पर से निम्न XML:

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

आप इस्तेमाल कर सकते हैं:

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

XmlSerializer कक्षा का उपयोग करें। उदाहरणों के लिए रास्ते के बारे में 1/3 नीचे स्क्रॉल करें। (कक्षा टी अपने कोड स्निपेट से लिया)

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(); 
    } 
} 
+0

+1 सीरियलाइजेशन भी कहने के लिए आया था। – Jeremy

+0

क्योंकि मैं इस XML फ़ाइल को नहीं भेज रहा हूं, क्या यह XmlSerializer के लिए जाने का एहसास होगा? – iniki

+1

XMLSerializer आपको किसी ऑब्जेक्ट को XML में कनवर्ट करने की अनुमति देता है। फ़ाइल में "भेजने" के साथ इसका कोई लेना-देना नहीं है। –

13

यहां ऐसी दो विधियां है कि हम इस XmlSerializer का उपयोग कर पूरा करने के लिए प्रयोग कर रहे हैं और कई बार यह सही जवाब है - - मैं व्यक्तिगत रूप से एक्सएमएल जो आप अपनी XML पर अधिक लचीला होना करने की अनुमति होगी के लिए Linq का प्रयोग करेंगे, और 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(); 
+2

और टी के उदाहरण में पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए। – zionpi

+1

यह काम नहीं कर रहा है – motto

5

नीचे कोड का उपयोग कर आप आसानी से एक xml फ़ाइल में serialise में सक्षम हो जाएगा:

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); 
     } 

पास ChoiceXML संग्रहित प्रक्रिया के लिए तो एसक्यूएल सर्वर Do नीचे के रूप में की तरह

@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

आप अपनाबचा सकते हैंडेटाटेबल में लिखें 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

यह सवाल से संबंधित कैसे है? –

+0

आपका क्या मतलब है? –

+0

आपकी [मूल प्रतिक्रिया] (http://stackoverflow.com/revisions/36350950/1) ने एक वर्ग 'व्यक्ति' का उपयोग किया जो बहुत भ्रमित था (प्रश्न से संबंधित नहीं था), विशेष रूप से आपने यह नहीं बताया कि कोड क्या है किसी भी तरह से करता है।कोड को पेस्ट करने के लिए, कुछ सामान्य स्पष्टीकरण प्रदान करना हमेशा सर्वोत्तम होता है। –

संबंधित मुद्दे