2011-06-03 11 views
8

में कनवर्ट करें मेरे पास एक एक्सएमएल फ़ाइल है जिसे मैं डेटाटेबल में डालना चाहता हूं। xml फ़ाइल का स्वरूप नीचे की तरह है:एक्सएमएल को डेटाटेबल

<userid ID="37729"> 
    <TestId ID="84" TimeRemaining="60" /> 
    <QuestId ID="1"> 
    <Answer1> 
    </Answer1> 
    <Answer2>B</Answer2> 
    <Answer3> 
    </Answer3> 
    <Answer4> 
    </Answer4> 
    </QuestId> 
</userid> 

अब मैं नीचे की तरह सम्मिलित करने के लिए है कि एक डेटा तालिका में हैं:

Question Id  Answer1  Answer2  Answer3  Answer4 
1     A           D 

2        B    C  

3           C      

किसी भी एक मेरी मदद कर सकते इस लक्ष्य को हासिल करने के लिए।

+0

जो डेटा आपको datatable में डालने की आवश्यकता फ़ॉर्मेट करें ठीक से:

यह किसी भी एक्सएमएल कि ने (इस नमूने की तरह) कम से कम 3 स्तरों स्वीकार करता है। इस तरह समझना मुश्किल है। –

+1

क्या कोई विशिष्ट कारण है जिसे आपको 'डेटाटेबल' की आवश्यकता है? आप शायद एक धारावाहिक वर्ग को परिभाषित कर सकते हैं और इसे किसी ऑब्जेक्ट में जितना आसान हो सके, और यह उस रूप में अधिक उपयोगी होगा। –

+0

@ जो एनोस हाँ, जैसे @ कोलिने सुझाव देते हैं, आप लिंक-टू-एक्सएमएल का उपयोग कर सकते हैं। – DOK

उत्तर

14

मैं पहले आपको आवश्यक कॉलम के साथ DataTable बनाउंगा, फिर इसे लिंक-टू-एक्सएमएल के माध्यम से पॉप्युलेट करें।

आप एक का चयन क्वेरी इस्तेमाल कर सकते हैं, एक वस्तु कि प्रत्येक पंक्ति का प्रतिनिधित्व करता है बनाने के लिए तो प्रत्येक आइटम के लिए DataRows बनाने के लिए मानक दृष्टिकोण का उपयोग करें ...

class Quest 
{ 
    public string Answer1; 
    public string Answer2; 
    public string Answer3; 
    public string Answer4; 
} 

public static void Main() 
{ 
    var doc = XDocument.Load("filename.xml"); 

    var rows = doc.Descendants("QuestId").Select(el => new Quest 
    { 
     Answer1 = el.Element("Answer1").Value, 
     Answer2 = el.Element("Answer2").Value, 
     Answer3 = el.Element("Answer3").Value, 
     Answer4 = el.Element("Answer4").Value, 
    }); 

    // iterate over the rows and add to DataTable ... 

} 
+0

यह निश्चित रूप से काम करेगा। +1 =) –

+7

लेकिन मैं हवादार हूं कि मुझे 'new()' – user1590636

+0

@ user1590636 के बाद 'अपेक्षित टाइप' क्यों मिलता है क्योंकि यह कोड संकलित नहीं होता है। मैंने आवश्यक जानकारी को उत्तर में संपादित किया। एक और मामूली गलती यह थी कि अधिभार 'XDocument.Load (yourxmlstring)' स्ट्रिंग को एक फ़ाइल की उरी होने की अपेक्षा करता है (https://msdn.microsoft.com/en-us/library/bb343181 (v = बनाम। 110) .aspx), और शाब्दिक एक्सएमएल नहीं - तर्क नाम को "filename.xml" में बदल दिया। जब आपको स्ट्रिंग से सीधे लोड करने की आवश्यकता होती है, तो मेमोरीस्ट्रीम का उपयोग करें। – dlatikay

2

How To Read XML Data into a DataSet by Using Visual C# .NET कुछ विवरण हैं। असल में, आप डेटासेट में डेटा प्राप्त करने के लिए अधिभारित DataSet method ReadXml का उपयोग कर सकते हैं। आपका एक्सएमएल डेटा पहले डेटाटेबल में होगा।

DataTable.ReadXml method भी है।

+0

क्या आप सुनिश्चित हैं कि XML उपलब्ध है ReadXml के लिए उपयुक्त प्रारूप है? – ColinE

+0

@ कोलिने, नहीं, मुझे यकीन नहीं है, खासकर सवाल के संपादन के साथ। कोड चलाकर पता लगाना आसान होगा। यदि यह दृष्टिकोण काम करता है, तो यह कॉलम और चयन कथन बनाने से बच जाएगा। यदि डेटा स्रोत को रीडएक्सएमएल दृष्टिकोण के अनुरूप बनाया जा सकता है, तो यह बहुत से प्रयासों को बचाएगा। – DOK

9
DataSet ds = new DataSet(); 
ds.ReadXml(fileNamePath); 
+6

क्या आप सुनिश्चित हैं कि XML उपलब्ध है ReadXml के लिए उपयुक्त प्रारूप है? – ColinE

1

आप इस कोड का उपयोग कर सकते हैं (अनुशंसित)

MemoryStream objMS = new MemoryStream(); 
DataTable oDT = new DataTable();//Your DataTable which you want to convert 
oDT.WriteXml(objMS); 
objMS.Position = 0; 
XPathDocument result = new XPathDocument(objMS); 

यह एक और तरीका है लेकिन पहले पूर्व। अनुशंसित

StringWriter objSW = new StringWriter(); 
DataTable oDt = new DataTable();//Your DataTable which you want to convert 
oDt.WriteXml(objSW); 
string result = objSW.ToString(); 
+2

और एक्सएमएल कहां है जिसे आप डेटाटेबल में डालने जा रहे हैं? कृपया पहले प्रश्न पढ़ें। – nZeus

-2

शायद यह एक छोटा सा लेख हो सकता है। लेकिन उपरोक्त उत्तरों में से मुझे जरूरी मेरी मदद नहीं करनी चाहिए। तब मैंने इसके लिए एक छोटा सा स्निपेट लिखा।

<XmlData> 
    <XmlRow> 
     <XmlField1>Data 1</XmlField1> 
     <XmlField2>Data 2</XmlField2> 
     <XmlField3>Data 3</XmlField3> 
     ....... 
    </XmlRow> 
</XmlData> 

public static class XmlParser 
{ 
    /// <summary> 
    /// Converts XML string to DataTable 
    /// </summary> 
    /// <param name="Name">DataTable name</param> 
    /// <param name="XMLString">XML string</param> 
    /// <returns></returns> 
    public static DataTable BuildDataTableFromXml(string Name, string XMLString) 
    { 
     XmlDocument doc = new XmlDocument(); 
     doc.Load(new StringReader(XMLString)); 
     DataTable Dt = new DataTable(Name); 
     try 
     { 

      XmlNode NodoEstructura = doc.FirstChild.FirstChild; 
      // Table structure (columns definition) 
      foreach (XmlNode columna in NodoEstructura.ChildNodes) 
      { 
       Dt.Columns.Add(columna.Name, typeof(String)); 
      } 

      XmlNode Filas = doc.FirstChild; 
      // Data Rows 
      foreach (XmlNode Fila in Filas.ChildNodes) 
      { 
       List<string> Valores = new List<string>(); 
       foreach (XmlNode Columna in Fila.ChildNodes) 
       { 
        Valores.Add(Columna.InnerText); 
       } 
       Dt.Rows.Add(Valores.ToArray()); 
      } 
     } catch(Exception) 
     { 

     } 

     return Dt; 
    } 
} 

यह मेरी समस्या का समाधान

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