Могут ли XML-комментарии идти куда угодно?
Вопрос
Я написал простой инструмент для генерации XML-набора данных DBUnit с использованием запросов, которые вводит пользователь.Я хочу включать каждый запрос, введенный в XML, в качестве комментария, но DBUnit API для генерации XML-файла не поддерживает вставку комментария там, где я бы этого хотел (над данными, которые он генерирует), поэтому я прибегаю к размещению комментария со ВСЕМИ запросами либо вверху, либо внизу.
Итак, мой вопрос:допустимо ли использовать XML для размещения его в любом месте?Например, над объявлением XML:
<!-- Queries used: ... -->
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
...
</dataset>
Или ниже корневого узла:
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
...
</dataset>
<!-- Queries used: ... -->
Я планирую изначально попробовать приведенное выше XML-объявление, но у меня есть сомнения в том, является ли это допустимым XML, несмотря на утверждение от википедия:
Комментарии могут быть размещены в любом месте дерева, в том числе в тексте, если содержимым элемента является text или #PCDATA.
Я планирую опубликовать ответ, если это сработает, но было бы неплохо узнать, является ли это официальным стандартом XML.
Обновить: Видишь мой ответ ниже за результат моего теста.
Решение
В соответствии с Спецификация XML, хорошо сформированный XML-документ представляет собой:
document ::= prolog element Misc*
где prolog
является
prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?
и Misc
является
Misc ::= Comment | PI | S
и
XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
это означает, что, если вы хотите, чтобы комментарии были вверху, у вас не может быть объявления типа XML.
Однако вы можете размещать комментарии после объявления и вне элемента document, либо в верхней, либо в нижней части документа, поскольку Misc*
может содержать комментарии.
Спецификация согласуется с комментариями Википедии:
2.5 Комментарии
[Определение:Комментарии могут появляться в любом месте документа за пределами другой разметки;кроме того, они могут отображаться в объявлении типа документа в местах, разрешенных грамматикой.Они не являются частью символьных данных документа;XML-процессор МОЖЕТ, но не обязательно, предоставлять приложению возможность извлекать текст комментариев.Для совместимости строка "--" (через двойной дефис) НЕ ДОЛЖНА встречаться в комментариях.] Ссылки на объекты параметров НЕ ДОЛЖНЫ распознаваться в комментариях.
Все это вместе взятое означает, что вы можете оставлять комментарии в любом месте, которое не находится внутри другой разметки, за исключением того , что ты не может быть XML-объявления, если вы начинаете с комментария.
Однако, хотя теоретически теория согласуется с практикой, на практике это не так, поэтому мне было бы любопытно посмотреть, как пройдет ваш эксперимент.
Другие советы
Первый пример - недопустимый XML, объявление должно быть первым в XML-документе.
Но помимо этого, комментарии могут быть отправлены куда угодно еще.
Исправляю ваш первый пример:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Queries used: ... -->
<dataset>
</dataset>
Инструкция по обработке должна быть самой первой в содержимом XML (см. XML-комментарий и инструкции по обработке).Должно сработать следующее:
<?xml version='1.0' encoding='UTF-8'?>
<!-- Queries used: ... -->
<dataset>
...
</dataset>
Всем спасибо за ответы!
Как оказалось, комментарий перед файлом, казалось, работал, но когда я углубился в исходный код DBUnit, это произошло потому, что проверка отключена.
Я попробовал простую загрузку документа через:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("/path/to/file"));
и это завершается ошибкой с исключением, потому что XML-объявление не является первым (как указывали другие, это имело бы место).
Итак, хотя DBUnit будет работать, я предпочитаю иметь действительный XML, поэтому я переместил комментарий в конец (поскольку DBUnit генерирует XML-объявление, разместить комментарий под ним невозможно, хотя я бы предпочел это...по крайней мере, не без изменения XML постфактум, что потребовало бы больше работы, чем того стоит).