XmlWriter для записи в строку вместо файла

У меня есть служба WCF, которая должна возвращать строку XML. Но похоже, что писатель только хочет создать файл, а не строку. Я пробовал:

string nextXMLstring = "";
using (XmlWriter writer = XmlWriter.Create(nextXMLstring))

Это порождает ошибку, говорящую, что nextXMLstring не имеет пути к файлу. Он хочет что-то вроде:

using (XmlWriter writer = XmlWriter.Create("nextXMLstring.xml"))

Как я могу создать свой XML и затем вернуть его как строку?

Спасибо!!

Ответ 1

Вам нужно создать StringWriter и передать это XmlWriter.

Перегрузка строки XmlWriter.Create для имени файла.

например.

using (var sw = new StringWriter()) {
  using (var xw = XmlWriter.Create(sw)) {
    // Build Xml with xw.


  }
  return sw.ToString();
}

Ответ 2

Как сказал Ричард, StringWriter - это путь вперед. Однако есть одна загвоздка: по умолчанию StringWriter будет рекламировать себя как UTF-16. Обычно XML находится в UTF-8. Вы можете исправить это путем подкласса StringWriter;

public class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding
    {
         get { return Encoding.UTF8; }
    }
}

Это повлияет на объявление, написанное XmlWriter. Конечно, если вы затем напишите строку в другом месте в двоичной форме, убедитесь, что вы используете кодировку, которая соответствует любой кодировке, которую вы исправляете для StringWriter. (Вышеприведенный код всегда предполагает UTF-8, тривиально, чтобы сделать более общую версию, которая принимает кодировку в конструкторе.)

Затем вы использовали:

using (TextWriter writer = new Utf8StringWriter())
{
    using (XmlWriter xmlWriter = XmlWriter.Create(writer))
    {
        ...
    }
    return writer.ToString();
}

Ответ 3

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

using (var ms = new MemoryStream())
{
    using (var x = new XmlTextWriter(ms, new UTF8Encoding(false)) 
                       { Formatting = Formatting.Indented })
    {
         // ...
         return Encoding.UTF8.GetString(ms.ToArray());
    }
}

Ответ 4

Используйте StringBuilder:

var sb = new StringBuilder();
    using (XmlWriter xmlWriter = XmlWriter.Create(sb))
    {
        ...
    }
return sb.ToString();

Ответ 5

Ребята не забудьте вызвать xmlWriter.Close() и xmlWriter.Dispose(), иначе ваша строка не закончит создание. Это будет пустая строка