سؤال

إليك سؤال سريع كنت أضرب رأسي به اليوم.

أحاول تحويل مجموعة بيانات .Net إلى تدفق XML، وتحويلها باستخدام ملف xsl في الذاكرة، ثم إخراج النتيجة إلى ملف XML جديد.

إليك الحل الحالي:

        string transformXML = @"pathToXslDocument";

        XmlDocument originalXml = new XmlDocument();

        XmlDocument transformedXml = new XmlDocument();

        XslCompiledTransform transformer = new XslCompiledTransform();

        DataSet ds = new DataSet();

        string filepath;

        originalXml.LoadXml(ds.GetXml()); //data loaded prior

        StringBuilder sb = new StringBuilder();

        XmlWriter writer = XmlWriter.Create(sb);

        transformer.Load(transformXML);

        transformer.Transform(originalXml, writer); //no need to select the node

        transformedXml.LoadXml(sb.ToString());

        transformedXml.Save(filepath);

        writer.Close();

إليك الكود الأصلي:

BufferedStream stream = new BufferedStream(new MemoryStream());

DataSet ds = new DataSet();

da.Fill(ds);

ds.WriteXml(stream);

StreamReader sr = new StreamReader(stream, true);

stream.Position = 0; //I'm not certain if this is necessary, but for the StreamReader to read the text the position must be reset.

XmlReader reader = XmlReader.Create(sr, null);  //Problem is created here, the XmlReader is created with none of the data from the StreamReader

XslCompiledTransform transformer = new XslCompiledTransform();

transformer.Load(@"<path to xsl file>");

transformer.Transform(reader, null, writer); //Exception is thrown here, though the problem originates from the XmlReader.Create(sr, null)

لسبب ما في طريقة Transformer.Transform، لا يوجد للقارئ عقدة جذر، في الواقع لا يقرأ القارئ أي شيء من StreamReader.

سؤالي هو ما هو الخطأ في هذا الرمز؟ثانيًا، هل هناك طريقة أفضل لتحويل/تحويل/تخزين مجموعة بيانات إلى XML؟

يحرر:كانت كلتا الإجابتين مفيدتين وكانت إجابة aku أقرب من الناحية الفنية.ومع ذلك فإنني أميل نحو حل يشبه إلى حد كبير حل Longhorn بعد تجربة كلا الحلين.

هل كانت مفيدة؟

المحلول

لست متأكدًا ولكن يبدو أنك لم تقم بإعادة تعيين الموضع في الدفق قبل تمريره إلى XmlReader.حاول البحث في بداية الدفق الخاص بك قبل محاولة القراءة منه.قد يكون من الضروري أيضًا إغلاق الدفق\تدفقه بعد كتابة بعض البيانات عليه.

يحرر:

لقد حاولت فقط اتباع التعليمات البرمجية وعملت بشكل مثالي:

    BufferedStream stream = new BufferedStream(new MemoryStream());
    stream.Write(Encoding.ASCII.GetBytes("<xml>foo</xml>"), 0, "<xml>foo</xml>".Length);
    stream.Seek(0, SeekOrigin.Begin);
    StreamReader sr = new StreamReader(stream);
    XmlReader reader = XmlReader.Create(sr);
    while (reader.Read())
    {
         Console.WriteLine(reader.Value);
    }
    stream.Close();

نصائح أخرى

يجب عليك تحديد العقدة الجذرية.هذا لا يستخدم مجموعات البيانات، لكني أستخدم هذه الوظيفة كل يوم وهي تعمل بشكل رائع.

System.Xml.XmlDocument orgDoc = new System.Xml.XmlDocument();
orgDoc.LoadXml(orgXML);

// MUST SELECT THE ROOT NODE
XmlNode transNode = orgDoc.SelectSingleNode("/");
System.Text.StringBuilder sb = new System.Text.StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);

System.IO.StringReader stream = new System.IO.StringReader(transformXML);
XmlReader reader = XmlReader.Create(stream);

System.Xml.Xsl.XslCompiledTransform trans = new System.Xml.Xsl.XslCompiledTransform();
trans.Load(reader);
trans.Transform(transNode, writer);

XmlDocument doc = new XmlDocument();
doc.LoadXml(sb.ToString());

return doc;

يرجى النظر فيه والاستفادة ..

using (MemoryStream memStream = new MemoryStream())
            {
                memStream.Write(Encoding.UTF8.GetBytes(xmlBody), 0, xmlBody.Length);
                memStream.Seek(0, SeekOrigin.Begin);

                using (StreamReader reader = new StreamReader(memStream))
                {
                    // xml reader setting.
                    XmlReaderSettings xmlReaderSettings = new XmlReaderSettings()
                    {
                        IgnoreComments = true,
                        IgnoreWhitespace = true,

                    };

                    // xml reader create.
                    using (XmlReader xmlReader = XmlReader.Create(reader, xmlReaderSettings))
                    {                           
                        XmlSerializer xmlSerializer = new XmlSerializer(typeof(LoginInfo));
                        myObject = (LoginInfo)xmlSerializer.Deserialize(xmlReader);

                    }

                }         
            }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top