Primo Chalice Ответов: 1

Как читать XML с помощью memorystream и streamreader?


- Привет!

Я использую MemoryStream и StringBuilder и хочу прочитать XML-файл с помощью StreamReader/StreamWriter.

Пожалуйста помочь.

С уважением
Аман

Что я уже пробовал:

XDocument xdoc = new XDocument();
string filecontent = PreProcessXML(lvi.Tag.ToString()); //XML File

using (MemoryStream ms = new MemoryStream())
{
  using (StreamWriter sw = new StreamWriter(ms))
{
  sw.Write(filecontent);
  using (StreamReader sr = new StreamReader(ms))
{
  sr.ReadToEnd();
  xdoc = XDocument.Load(sr); //System.Xml.XmlException: 'Root element is missing.' I am getting this error here during execution.
}
}
}


//Custom Function to change a few tags in the original XML for input.

private string PreProcessXML(String xmlpath)
{
  StringBuilder sb = new StringBuilder();

  string openbreak = "";
  string closebreak = "";

  foreach (var line in File.ReadLines(xmlpath))
{
  if (line.StartsWith("<break "))
{
  openbreak = line.Replace("/", "");

  if (closebreak != "")
{
  sb.AppendLine(closebreak);
}
  else
  closebreak = "</break>";

  sb.AppendLine(openbreak);
}
  else
{
  if (line == "</sec>")
{
  sb.AppendLine(closebreak);
  closebreak = "";
}
  sb.AppendLine(line);
}
}
  return sb.ToString();
}

Richard MacCutchan

Почему ты все усложняешь для себя? Просто вставьте исходный файл в считыватель, и вам не понадобится вся эта дополнительная обработка.

1 Ответов

Рейтинг:
0

OriginalGriff

Посмотрите на свой код:

sr.ReadToEnd();
xdoc = XDocument.Load(sr);
Итак, поток находится в конце данных, и вы передаете его в XML-процессор? Перемотайте его назад, чтобы он был при каких-то данных!
using (MemoryStream ms = new MemoryStream())
    {
    using (StreamWriter sw = new StreamWriter(ms))
        {
        sw.Write(filecontent);
        using (StreamReader sr = new StreamReader(ms))
            {
            sr.BaseStream.Seek(0, SeekOrigin.Begin);
            ...
            }
        }
    }


Primo Chalice

Решение решило эту проблему, но породило другую. Поэтому я использовал следующий подход и он сработал :)

byte[] myByteArray = System.Text.Encoding.UTF8.GetBytes(filecontent);
MemoryStream ms = новый MemoryStream(myByteArray);
StreamReader sr = новый StreamReader(ms);
xdoc = XDocument.Нагрузка(sr);

Primo Chalice

Кроме того, Пожалуйста, ответьте на этот вопрос, если можете. Мне действительно нужно решение для этого:
https://www.codeproject.com/Questions/1275827/How-do-I-remove-the-child-nodes-but-still-keep-the

С уважением