Что означает "DOCTYPE NEWFILE SYSTEM"? - PullRequest
       28

Что означает "DOCTYPE NEWFILE SYSTEM"?

2 голосов
/ 15 октября 2010

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

<!DOCTYPE NEWFILE SYSTEM "XXX_OUT_1234_YYMMDD_00.dtd">

Я хотел бы знать, для чего он используется и нужен ли он вообще. Данные загружаются в SQL с помощью массового загрузчика C #, используя схему и имя файла (я изложу основы ниже, есть еще несколько шагов, но я не думаю, что это действительно актуально.)

SQLXMLBulkLoad3Class objBL = new SQLXMLBulkLoad3Class();
objBL.Execute (schema,filename);

файл схемы имеет имя, подобное этому XXX_OUT_1234_090700_06.xsd, похожее на Doctype.

Теперь причина в том, что doctype будет удален, и я не уверен, действительно ли он используется. Я посмотрел вокруг, но в основном doctypes используются с веб-сайтами (это старое приложение для форм Windows). Большая часть информации, которую я нахожу, похожа на приведенную ниже, и я хотел бы знать, что делает doctype в этом случае.

Проверка в соответствии с DTD является прямой задачей, если фрагмент XML содержит объявление DOCTYPE с идентификатором SYSTEM, которое может быть разрешено во время проверки. Просто создайте объект Validator, используя один из конструкторов с одним аргументом.

1 Ответ

5 голосов
/ 15 октября 2010

Хороший вопрос. В основном люди просто игнорируют фактическое содержание оператора DOCTYPE:)

(основной) синтаксис объявления типа документа:

<!DOCTYPE root-element PUBLIC "publicID" SYSTEM "systemID">

Публичный идентификатор является необязательным, поэтому вы также можете сказать:

<!DOCTYPE root-element SYSTEM "systemID">

В обоих случаях токен, следующий за DOCTYPE, представляет собой имя корневого элемента документа XML или SGML, содержащего это объявление. Итак ...

<!DOCTYPE NEWFILE SYSTEM "XXX_OUT_1234_YYMMDD_00.dtd">
<NEWFILE>
...
</NEWFILE>

И идентификаторы PUBLIC, и SYSTEM ссылаются на DTD для этого экземпляра документа. Идентификатор SYSTEM может использоваться для поиска физического файла, содержащего DTD. Идентификатор PUBLIC обычно используется с каталогами для предоставления локально кэшированного поиска для DTD. Это немного больше, чем это, но это основа. В вашем случае есть только идентификатор системы. Если бы вы использовали проверяющий парсер (я подозреваю, что нет), который проверял ваш документ по DTD (на этот раз тип документа определение ), он использовал бы эту информацию для поиска самого DTD. Если у вас нет каталога (вы почти наверняка его не имеете), приложение будет искать «XXX_OUT_1234_YYMMDD_00.dtd» в том же месте, что и сам файл экземпляра. Если вы не получаете ошибки валидации, она не просматривается, и вы можете безопасно удалить объявление

Если у вас есть схема для этого контента, то DOCTYPE довольно избыточен (есть некоторые варианты использования, когда вы используете сущности, но вы, вероятно, нет). Вы почти наверняка можете безопасно удалить его, так как я был бы очень удивлен, если вы проверяете DTD в этом процессе.

...