XmlWriter для записи в строку вместо файла - PullRequest
107 голосов
/ 05 июня 2009

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

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

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

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

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

Спасибо !!

Ответы [ 6 ]

201 голосов
/ 05 июня 2009

Вам необходимо создать StringWriter и передать его XmlWriter.

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

* 1005 Е.Г. *

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


  }
  return sw.ToString();
}
107 голосов
/ 05 июня 2009

Как сказал Ричард, 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();
}
28 голосов
/ 03 сентября 2009

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

using (var ms = new MemoryStream())
using (var x = new XmlTextWriter(ms, new UTF8Encoding(false)) 
                   { Formatting = Formatting.Indented })
{
     // ...
     return Encoding.UTF8.GetString(ms.ToArray());
}
11 голосов
/ 17 декабря 2012

Использование StringBuilder:

var sb = new StringBuilder();
    using (XmlWriter xmlWriter = XmlWriter.Create(sb))
    {
        ...
    }
return sb.ToString();
1 голос
/ 14 апреля 2016

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

0 голосов
/ 02 августа 2018

Ну, я думаю, что самое простое и быстрое решение здесь было бы просто:

StringBuilder sb = new StringBuilder();

using (var writer = XmlWriter.Create(sb, settings))
{
    ... // Whatever code you have/need :)

    sb = sb.Replace("encoding=\"utf-16\"", "encoding=\"utf-8\""); //Or whatever uft you want/use.
    //Before you finally save it:
    File.WriteAllText("path\\dataName.xml", sb.ToString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...