Почему возврат каретки удаляется при изменении атрибутов XML в SQL Server?

В SQL Server 2014 я пытаюсь добавить элемент XML с атрибутом (который содержит возврат каретки), используя метод «изменить» для типа данных XML. Возврат каретки удаляется - почему?

Пример:

declare @xmldata xml

select 
    @xmldata = '<root><child myattr="carriage returns &#xD;&#xA; are not a problem"></child></root>'

set 
   @xmldata.modify('insert <child>modifying text with carriage returns works&#xD;&#xA;ok</child> after (//child)[1]')

set 
   @xmldata.modify('insert <child myattr="but not&#xD;&#xA;attribute values... why is that?"></child> after (//child)[2]')

select @xmldata

Результат:

<root>
  <child myattr="carriage returns &#xD;&#xA; are not a problem" />
  <child>modifying text with carriage returns works
ok</child>
  <child myattr="but not attribute values... why is that?" />
</root>

person Thomas Boel Sigurdsson    schedule 20.11.2015    source источник


Ответы (2)


Символы пробела могут быть нормализованы синтаксическими анализаторами.

cf http://www.w3.org/TR/1998/REC-xml-19980210#AVNormalize

Хотя ваш XML действителен, то, как именно отображается пробел, зависит от реализации. Как видите, crlf был заменен одним пробелом.

Обратите внимание

В целом XML работает по-разному с Content и Structural/Meta Data.

Значения атрибутов считаются структурой, а данные между тегами — содержимым.

При разработке XML никогда не предполагалось, что атрибуты будут отображаться на устройствах конечных пользователей, я бы посоветовал вам просто создать еще один тег для этого содержимого конечного пользователя.

person Hogan    schedule 20.11.2015
comment
Это не проблема рендеринга, поскольку в первом примере CRLF сохраняется и отображается правильно (‹child myattr=возврат каретки не является проблемой /›). - person Thomas Boel Sigurdsson; 23.11.2015
comment
@ThomasBoelSigurdsson --- вы ошибаетесь ... КАК ГОВОРЯТ СПЕЦИФИКАЦИЯ, требования для рендеринга одного отличаются от требований для рендеринга другого. Я настоятельно рекомендую вам прочитать спецификацию XML, она не длинная, и вы увидите, насколько сильно отличаются правила для атрибутов тегов от правил для содержимого документа. Но должно быть ясно... один контент, другой структурные или метаданные. - person Hogan; 23.11.2015
comment
Не хочу с вами не соглашаться, но я считаю, что вы ошибаетесь. Пожалуйста, взгляните на мой пример еще раз. У меня есть два элемента ‹child›, каждый из которых имеет атрибут myattr. Оба атрибута должны иметь возврат каретки + новую строку, но только один из них. Тот, который создан с использованием метода модификации, не работает, поскольку они каким-то образом удалены. - person Thomas Boel Sigurdsson; 24.11.2015
comment
@ThomasBoelSigurdsson - Как я ошибаюсь - эта функциональность зависит от платформы - если программное обеспечение вашей платформы не документирует другую ожидаемую функциональность, оно работает в соответствии со спецификацией и в соответствии с проектом. Однако моя заметка с ответом была неправильной, поэтому я отредактировал ее. - person Hogan; 24.11.2015

Раздел 3.3.3, Нормализация значений атрибутов

Прежде чем значение атрибута будет передано приложению или проверено на достоверность, процессор XML ДОЛЖЕН нормализовать значение атрибута, применяя описанный ниже алгоритм или используя какой-либо другой метод, чтобы значение, переданное приложению, было таким же, как и созданное. по алгоритму.

  1. Все разрывы строк ДОЛЖНЫ быть нормализованы при вводе в #xA, как описано в 2.11 Обработка конца строки, поэтому остальная часть этого алгоритма работает с текстом, нормализованным таким образом.
  2. Начните с нормализованного значения, состоящего из пустой строки.
  3. Для каждого символа, ссылки на сущность или ссылки на символ в ненормализованном значении атрибута, начиная с первого и заканчивая последним, выполните следующие действия:

    Для ссылки на символ добавьте указанный символ к нормализованному значению. Для ссылки на объект рекурсивно примените шаг 3 этого алгоритма к замещающему тексту объекта. Для символа пробела (#x20, #xD, #xA, #x9) добавьте символ пробела (#x20) к нормализованному значению. Для другого символа добавьте его к нормализованному значению. Если тип атрибута не CDATA, то процессор XML ДОЛЖЕН дополнительно обработать нормализованное значение атрибута, отбрасывая все начальные и конечные пробелы (#x20) и заменяя последовательности пробелов (#x20) одним пробелом (#x20). ) персонаж.

Спецификация XML требует, чтобы символы CR/LF в атрибуте были преобразованы в один пробел.

person Remus Rusanu    schedule 24.11.2015