XmlWriter для записи в строку вместо файла
У меня есть служба WCF, которая должна вернуть строку XML. Но, похоже, писатель хочет создать только файл, а не строку. Я старался:
string nextXMLstring = "";
using (XmlWriter writer = XmlWriter.Create(nextXMLstring))
Это приводит к ошибке, говорящей, что nextXMLstring не имеет пути к файлу. Он хочет что-то вроде:
using (XmlWriter writer = XmlWriter.Create("nextXMLstring.xml"))
Как я могу создать свой XML, а затем вернуть его в виде строки??
Спасибо!!
6 ответов
Вам нужно создать StringWriter и передать его XmlWriter.
Перегрузка строки XmlWriter.Create для имени файла.
Например
using (var sw = new StringWriter()) {
using (var xw = XmlWriter.Create(sw)) {
// Build Xml with xw.
}
return sw.ToString();
}
Как сказал Ричард, 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();
}
Я знаю, что это старое и ответили, но вот еще один способ сделать это. Особенно, если вам не нужна спецификация UTF8 в начале вашей строки и вы хотите, чтобы текст с отступом:
using (var ms = new MemoryStream())
using (var x = new XmlTextWriter(ms, new UTF8Encoding(false))
{ Formatting = Formatting.Indented })
{
// ...
return Encoding.UTF8.GetString(ms.ToArray());
}
Использование StringBuilder
:
var sb = new StringBuilder();
using (XmlWriter xmlWriter = XmlWriter.Create(sb))
{
...
}
return sb.ToString();
Ребята не забывайте вызывать xmlWriter.Close() и xmlWriter.Dispose(), иначе ваша строка не будет завершена. Это будет просто пустая строка
Ну, я думаю, что самое простое и быстрое решение здесь было бы просто:
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());
}