2013-04-28 1 views
1

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

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

Вот боли я получил:

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

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

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

Вопрос: Так что, если я не могу использовать XML 1.1, что самое лучшее решение, чтобы написать «блок разделитель» в файл XML и ввоз?

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


Резюме:

Давайте сделаем аналогию: Давайте подумаем о том, как работает компилятор, есть две фазы: "Pre-компиляции" и "Compile".

Для создания файла XML он действует как фаза «Скомпилировать». Например. конвертировать "<" в "& l t;"

Однако Unit Separator не поддерживается XML 1.0, поэтому фаза «Compile» не преобразует его в HTML Entity »& # x 1 F;"

Таким образом, мы должны искать решение на этапе «Предварительная компиляция», которое является ответственностью нашего собственного приложения.

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

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, мы должны написать собственный код «Предкомпилировать» для обработки символов Unicode перед подачей фазы «Скомпилировать».

Примечание: Я заимствовал идею «_ x 2 4 1F _» от here. Спасибо за помощь каждого

+0

Нынешний опыт работы с MSXML, но я [изумлен] (http://en.wikipedia.org/wiki/List_of_Unicode_characters). Если char 0x1F и '' или '& # x001F;' не работают, попробуйте '<[CDATA [... char 0x1F ...]]>'. –

+0

Итак, вы предлагаете «"? Я попробую. Спасибо – milesma

+0

Привет Joop. Поскольку разделитель единиц в значении атрибута (появляется в кавычках), он оказался в файле XML, который должен быть «<! [CDATA [& # x1F;]] >« – milesma

ответ

0

Возможно, добавление внутреннего DTD в файл XML может сработать для вас?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE root [<!ENTITY 0x1F "&#x1F;">]> 
<root> 
    <Units>Unit1&0x1F;Unit2</Units> 
</root> 
+0

Это хорошая идея, о которой я не знаю раньше. Однако в моем проекте я не могу добавить внутренний DTD, и я не могу ожидать, откуда идет XML-файл (так что я должен ожидать, что XML-файл не будет иметь это DTD). – milesma

+0

Отмечено как ответ. Тем не менее, я не принимаю этот метод в своем проекте. См. Раздел «Сводка» ... – milesma

+0

@milesma Имо вы не должны принимать ответ, который вам не помог, даже если это отличная идея – Patashu