Могут ли XML-комментарии идти куда угодно?

Я написал простой инструмент для создания набора данных DBUnit XML с использованием запросов, которые вводит пользователь. Я хочу включить каждый запрос, введенный в XML в качестве комментария, но API DBUnit для генерации XML файла не поддерживает вставку комментария, где я бы хотел (над данными, которые он генерирует), поэтому я прибегаю к комментарий со всеми запросами либо вверху, либо внизу.

Итак, мой вопрос: действительно ли это XML, чтобы разместить его в любом месте? Например, над XML-декларацией:

<!-- Queries used: ... -->
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  ...
</dataset>

Или ниже корня node:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  ...
</dataset>
<!-- Queries used: ... -->

Я планирую сначала попробовать над XML-декларацией, но у меня есть сомнения в том, что это действительный XML, несмотря на требование wikipedia:

Комментарии могут быть размещены в любом месте дерева, в том числе в тексте, если содержимое элемента является текстовым или #PCDATA.

Я планирую отправить сообщение, если это сработает, но было бы неплохо узнать, является ли он официальным стандартом XML.

UPDATE: Посмотрите мой ответ ниже для результата моего теста.

Ответ 1

Согласно спецификации XML, правильно сформированный документ XML:

document ::= prolog element Misc*

где prolog

prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?

и Misc

Misc ::= Comment | PI | S

а также

XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'

Это означает, что если вы хотите иметь комментарии вверху, вы не можете иметь объявление типа XML.

Однако вы можете иметь комментарии после объявления и вне элемента документа, либо в верхней, либо в нижней части документа, потому что Misc* может содержать комментарии.

Спецификация согласуется с Википедией по комментариям:

2.5 Комментарии

[Определение: комментарии могут появляться в любом месте документа за пределами другой разметки; кроме того, они могут появляться в объявлении типа документа в местах, разрешенных грамматикой. Они не являются частью символьных данных документа; XML-процессор МОЖЕТ, но не обязан, позволять приложению получать текст комментариев. Для совместимости строка "-" (двойной дефис) НЕ ДОЛЖНА встречаться в комментариях.] Ссылки на объекты параметров НЕ ДОЛЖНЫ распознаваться в комментариях.

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

Однако, хотя в теории теория согласуется с практикой, на практике это не так, поэтому мне было бы интересно посмотреть, как работает ваш эксперимент.

Ответ 2

Первый пример недействителен XML, объявление должно быть первым в XML-документе.

Но кроме этого комментарии могут отправляться куда угодно.

Исправление вашего первого примера:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Queries used: ... -->
<dataset>
</dataset>

Ответ 3

Инструкция по обработке должна быть самой первой в XML-контенте (см. комментарий XML и инструкции по обработке). Должно работать следующее:

<?xml version='1.0' encoding='UTF-8'?>
<!-- Queries used: ... -->
<dataset>
  ...
</dataset>

Ответ 4

Спасибо за ответы всем!

Как оказалось, комментарий перед файлом, похоже, сработал, но когда я углубился в источник DBUnit, это происходит потому, что проверка отключена.

Я попробовал простую загрузку документа через:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("/path/to/file"));

и это не выполняется с исключением, потому что XML-декларация - это не первое (как указывали другие).

Итак, в то время как DBUnit будет работать, я предпочитаю иметь правильный XML, поэтому я переместил комментарий до конца (поскольку DBUnit генерирует XML-декларацию, это не вариант размещения комментария ниже, хотя я бы предпочел что... по крайней мере, не изменив XML после факта, который будет больше работы, чем это стоит).