У меня есть код, которому передан string
, содержащий XML. Этот XML может содержать один или несколько экземпляров  
(ссылка на сущность для символа пробела). У меня есть требование, чтобы эти ссылки не были разрешены (то есть они должны не заменяться действительным пробелом).
Можно ли мне как-нибудь этого добиться?
В основном, с учетом строки, содержащей XML:
<pattern value="[A-Z0-9 ]" />
Я не хочу преобразовать его в:
<pattern value="[A-Z0-9 ]" />
(Чего я на самом деле пытаюсь добиться, так это просто взять строку XML и записать ее в «довольно распечатанный» файл. Это побочный эффект от разрешения вхождений  
в строке в один символ пробела, который необходимо сохранить. Причина этого требования заключается в том, что написанный XML-документ должен соответствовать внешней спецификации.)
Я попытался создать подкласс XmlTextReader
для чтения из строки XML и переопределить метод ResolveEntity()
, но это не вызывается. Я также попытался назначить пользовательский XmlResolver
.
Я также пытался, как и предполагалось, «дважды кодировать». К сожалению, это не дало желаемого эффекта, поскольку &
является , а не , декодируемым синтаксическим анализатором. Вот код, который я использовал:
string schemaText = @"...<pattern value=""[A-Z0-9&#x20;]"" />...";
XmlWriterSettings writerSettings = new XmlWriterSettings();
writerSettings.Indent = true;
writerSettings.NewLineChars = Environment.NewLine;
writerSettings.Encoding = Encoding.Unicode;
writerSettings.CloseOutput = true;
writerSettings.OmitXmlDeclaration = false;
writerSettings.IndentChars = "\t";
StringBuilder writtenSchema = new StringBuilder();
using ( StringReader sr = new StringReader( schemaText ) )
using ( XmlReader reader = XmlReader.Create( sr ) )
using ( TextWriter tr = new StringWriter( writtenSchema ) )
using ( XmlWriter writer = XmlWriter.Create( tr, writerSettings ) )
{
XPathDocument doc = new XPathDocument( reader );
XPathNavigator nav = doc.CreateNavigator();
nav.WriteSubtree( writer );
}
Письменный XML заканчивается на:
<pattern value="[A-Z0-9&#x20;]" />