XmlWriter для Записи в Строку Вместо в Файл

Трудно обойтись без wait -n (например, оболочка в busybox не поддерживает его). Так что здесь есть обходной путь, он не оптимален, потому что он вызывает команды «jobs» и «wc» 10 раз в секунду. Например, вы можете уменьшить количество вызовов до 1x в секунду, если не возражаете подождать немного дольше, чтобы завершить каждую работу.

# $1 = maximum concurent jobs
#
limit_jobs()
{
   while true; do
      if [ "$(jobs -p | wc -l)" -lt "$1" ]; then break; fi
      usleep 100000
   done
}

# and now start some tasks:

task &
limit_jobs 2
task &
limit_jobs 2
task &
limit_jobs 2
task &
limit_jobs 2
wait
111
задан ChrisF 5 June 2009 в 12:47
поделиться

3 ответа

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

Строковая перегрузка XmlWriter.Create предназначена для имени файла.

Например,

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


  }
  return sw.ToString();
}
209
ответ дан 24 November 2019 в 02:56
поделиться

Как сказал Ричард, 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();
}
110
ответ дан 24 November 2019 в 02:56
поделиться

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

using (var ms = new MemoryStream())
using (var x = new XmlTextWriter(ms, new UTF8Encoding(false)) 
                   { Formatting = Formatting.Indented })
{
     // ...
     return Encoding.UTF8.GetString(ms.ToArray());
}
29
ответ дан 24 November 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: