У меня есть служба 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(), иначе ваша строка не закончит создание. Это будет пустая строка