Как записать разделитель единиц измерения в XML 1.0?

У меня есть «разделитель единиц измерения» 0x1F, хранящийся в базе данных.

Все, что я хотел, это использовать MSXML6.dll для экспорта разделителя единиц измерения в формат XML 1.0.

Вот какие у меня боли:

  1. Запись 0x1F напрямую в файл XML, сообщение об ошибке, атрибут закончился пустой строкой.

  2. Заменить на HTML Entity "& # x 1 F;", затем записать в файл XML, получилось: "& a m p ; # x 1 F;", что разочаровывает.

  3. Если я вручную изменю файл XML, чтобы заменить "& am p ; # x 1 F ;" на «& # x 1 F ;», синтаксический анализатор XML завершается ошибкой с исключением «Недопустимый символ Unicode».

Вопрос: Итак, если я не могу использовать XML 1.1, какое лучшее решение для записи "разделителя единиц измерения" в файл XML и импорта?

Примечание. Одним из возможных решений является замена «разделителя единиц измерения» какой-либо СТРАННОЙ строкой, например «$». Но хорошее ли это имя вообще? Каково ваше мнение, если я использую "0x1F" или "#x1F" или "#x1F;" вместо ""? Что лучше или какие-либо лучшие кандидаты?


Обзор:

Давайте проведем аналогию: Давайте подумаем о том, как работает компилятор, есть две фазы: «Предварительная компиляция» и «Компиляция».

Для генерации XML-файла он действует как этап «Компиляция». Например. преобразовать "‹" в "& l t ;"

Однако разделитель модулей не поддерживается XML 1.0, поэтому на этапе «Компиляция» он не будет преобразован в объект HTML «& # x 1 F ;»

Таким образом, мы должны искать решение на этапе "Pre-Compile", за который отвечает наше собственное приложение.

При написании:

Option1: <unit>aaa</unit><unit>bbb</unit>
Option2: simply use "_x241F_" to replace "\37" in the string if "_x241F_" is not conflicting with any existing token in the string.

При чтении:

According to Option1: Load the elements, catenate to a single string with "\37" as separator.
According to Option2: simply use "\37" to replace "_x241F_".

Я также обнаружил, что MSXML (даже самая высокая версия MSXML6.dll) не загружает XML 1.1.

Так что, если мы, к сожалению, используем MSXML, мы должны написать свой собственный код "Pre-Compile" для обработки символов Unicode перед подачей на фазу "Compile".

Примечание. Я позаимствовал идею "_ x 2 4 1F _" из здесь. Спасибо всем за помощь


person milesma    schedule 28.04.2013    source источник
comment
В настоящее время у меня нет опыта работы с MSXML, но я удивлен. Если символ 0x1F и &#31; или &#x001F; не работают, попробуйте <[CDATA[... char 0x1F ...]]>.   -  person Joop Eggen    schedule 29.04.2013
comment
Итак, вы предлагаете ‹![CDATA[ ]]›? Я попробую. Спасибо   -  person milesma    schedule 29.04.2013
comment
Привет, Джуп! Поскольку разделитель единиц находится в значении атрибута (появляется в кавычках), в XML-файле он оказался ![CDATA[#x1F;]]   -  person milesma    schedule 29.04.2013
comment
Что вы думаете, если я использую 0x1F или #x1F или #x1F; вместо ? Что лучше или какие-либо лучшие кандидаты?   -  person milesma    schedule 29.04.2013
comment
Извините, CDATA не работает внутри атрибута. Наиболее логично, что это должен быть управляющий символ US с кодом 0x1F, он же 31. Сущность &#31; кажется самой простой.   -  person Joop Eggen    schedule 29.04.2013


Ответы (1)


Может быть, вам поможет добавление внутреннего DTD в файл XML?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY 0x1F "&#x1F;">]>
<root>
  <Units>Unit1&0x1F;Unit2</Units>
</root>
person Mathijs Flietstra    schedule 28.04.2013
comment
Это хорошая идея, о которой я раньше не знал. Однако в моем проекте я не могу добавить внутренний DTD и не могу ожидать, откуда берется файл XML (поэтому я должен ожидать, что файл XML не будет иметь этого DTD) - person milesma; 29.04.2013
comment
Отмечено как ответ. Однако я не использую этот метод в своем проекте. См. раздел "Сводка"... - person milesma; 29.04.2013
comment
@milesma Имо, ты не должен принимать ответ, который тебе не помог, даже если это отличная идея - person Patashu; 29.04.2013