Хорошо, я нашел обходной путь.
Оказывается, что XmlWriter
делает правильные вещи, если на самом деле равен любому пробелу в блоке xml:space="preserve"
- только когда его нет, он облажается и добавляет некоторые. И удобно, это также работает, если есть некоторые пробельные узлы, даже если они пусты. Итак, хитрость, которую я придумала, состоит в том, чтобы украсить документ дополнительными пробелами нулевой длины в соответствующих местах, прежде чем пытаться выписать его. Результат - именно то, что я хочу: красивая печать везде, кроме тех случаев, когда пробелы значительны.
Обходной путь должен изменить внутренний блок на:
PreserveWhitespace(doc.DocumentElement);
doc.DocumentElement.WriteTo(writer);
...
private static void PreserveWhitespace(XmlElement root)
{
var nsmgr = new XmlNamespaceManager(root.OwnerDocument.NameTable);
foreach (var element in root.SelectNodes("//*[@xml:space='preserve']", nsmgr)
.OfType<XmlElement>())
{
if (element.HasChildNodes && !(element.FirstChild is XmlSignificantWhitespace))
{
var whitespace = element.OwnerDocument.CreateSignificantWhitespace("");
element.InsertBefore(whitespace, element.FirstChild);
}
}
}
Я все еще думаю, что такое поведение XmlWriter
, однако, является ошибкой.