Могут ли 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 после факта, который будет больше работы, чем это стоит).