Как преобразовать StreamReader в объект XMLReader в .Net 2.0 / C # - PullRequest
3 голосов
/ 03 сентября 2008

Вот быстрый вопрос, против которого я сегодня бился головой.

Я пытаюсь преобразовать набор данных .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?

Редактировать: оба ответа были полезны, и технически ответы Аку были ближе. Однако я склоняюсь к решению, которое больше похоже на решение Longhorn после попытки обоих решений.

Ответы [ 3 ]

6 голосов
/ 03 сентября 2008

Я не уверен, но кажется, что вы не сбросили позицию в потоке перед передачей ее в XmlReader. Попробуйте найти в начале вашего потока, прежде чем пытаться читать с него. Также может потребоваться закрыть \ очистить поток после того, как вы записали в него некоторые данные.

EDIT

Только что попробовал следующий код, и он работал отлично:

    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();
2 голосов
/ 03 сентября 2008

Вы должны выбрать корневой узел. Это не использует наборы данных, но я использую эту функцию каждый день, и она прекрасно работает.

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;
0 голосов
/ 27 февраля 2015

пожалуйста, посмотрите и используйте ..

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

                    }

                }         
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...