Правильное чтение вложенного XML-документа с помощью XmlReader.ReadInnerXML в .NET 3.5

Я использую XmlReader.ReadInnerXML для чтения XML-документа (как текста), встроенного в элемент внешнего XML-документа. Это отлично работает, за исключением обработки символов табуляции в атрибутах внутреннего XML. Пример:

<document>
  <interface>
    <scriptaction script="&#x9;one tab&#xD;&#xA;&#x9;&#x9;two tabs&#xD;&#xA;&#x9;&#x9;&#x9;three tabs" />
  </interface>
</document>

Когда ReadInnerXML используется на уровне элемента «документ», результирующая строка выглядит следующим образом:

<interface><scriptaction script=" one tab&#xD;&#xA;  two tabs&#xD;&#xA;   three tabs"/></interface>

IOW, вкладки превращаются в настоящие символы табуляции. Затем, когда мы затем анализируем полученный внутренний документ, вкладки нормализуются в пробелы в обычном режиме обработки пробелов, и результатом является преобразование символов табуляции в пробелы. Нам нужно сохранить значения атрибутов такими, какие они есть.

Мы безуспешно пытались возиться с различными настройками XmlReader. Возможно, это дефект в считывателе, или мы что-то делаем не так?

Заранее спасибо,

- Натан Аллан - Консультационная группа по базам данных


person N8allan    schedule 24.11.2009    source источник


Ответы (1)


Боюсь, такое поведение требуется спецификацией XML: http://www.w3.org/TR/REC-xml/#AVNormalize

Вы контролируете генерацию XML? Можете ли вы использовать вместо этого раздел CDATA?

person lesscode    schedule 24.11.2009
comment
Я думаю, что вы правы, хотя я бы посчитал это одним из многих недостатков XML. У меня есть контроль над созданием нового документа, но мне придется принять меры для обратной совместимости со старыми документами. В любом случае, спасибо! - person N8allan; 25.11.2009
comment
Если вы управляете генерацией, CDATA (или даже предпочитаете элемент атрибуту для этой информации) - это то, что вы хотите, чтобы контент прошел через синтаксический анализатор XML без помех. Я подозреваю, что правила нормализации значений атрибутов существуют для обеспечения того, чтобы все совместимые синтаксические анализаторы вели себя одинаково с эквивалентным контентом, чтобы не возникало специфических для платформы сюрпризов при работе с пробелами. - person lesscode; 26.11.2009