Анализ строки XML, содержащей "& # x20;" (который должен быть сохранен) - PullRequest
4 голосов
/ 04 мая 2010

У меня есть код, которому передан string, содержащий XML. Этот XML может содержать один или несколько экземпляров   (ссылка на сущность для символа пробела). У меня есть требование, чтобы эти ссылки не были разрешены (то есть они должны не заменяться действительным пробелом).

Можно ли мне как-нибудь этого добиться?

В основном, с учетом строки, содержащей XML:

<pattern value="[A-Z0-9&#x20;]" />

Я не хочу преобразовать его в:

<pattern value="[A-Z0-9 ]" />

(Чего я на самом деле пытаюсь добиться, так это просто взять строку XML и записать ее в «довольно распечатанный» файл. Это побочный эффект от разрешения вхождений &#x20; в строке в один символ пробела, который необходимо сохранить. Причина этого требования заключается в том, что написанный XML-документ должен соответствовать внешней спецификации.)

Я попытался создать подкласс XmlTextReader для чтения из строки XML и переопределить метод ResolveEntity(), но это не вызывается. Я также попытался назначить пользовательский XmlResolver.

Я также пытался, как и предполагалось, «дважды кодировать». К сожалению, это не дало желаемого эффекта, поскольку &amp; является , а не , декодируемым синтаксическим анализатором. Вот код, который я использовал:

string schemaText = @"...<pattern value=""[A-Z0-9&#x26;#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&amp;#x20;]" />

Ответы [ 2 ]

2 голосов
/ 04 мая 2010

Если вы хотите, чтобы он был сохранен, вам необходимо дважды закодировать его: &amp;#x20;. XML-ридер будет переводить объекты, более или менее так работает XML.

1 голос
/ 04 мая 2010
<pattern value="[A-Z0-9&#x26;#x20;]" />

То, что я сделал выше, заменено на «&» на «& # x26;» тем самым избегая амперсанда.

...