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

StackOverflow https://stackoverflow.com/questions/50824

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top