Могут ли комментарии XML идти куда-нибудь? - PullRequest
12 голосов
/ 09 сентября 2008

Я написал простой инструмент для генерации набора данных DBUnit XML с использованием запросов, которые вводит пользователь. Я хочу включить каждый запрос, введенный в XML, в качестве комментария, но API DBUnit для создания файла 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, несмотря на заявление wikipedia :

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

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

ОБНОВЛЕНИЕ: См. мой ответ ниже для результата моего теста.

Ответы [ 4 ]

12 голосов
/ 09 сентября 2008

В соответствии со спецификацией 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, если вы ведете с комментарием .

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

3 голосов
/ 09 сентября 2008

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

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

Исправляем ваш первый пример:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Queries used: ... -->
<dataset>
</dataset>
1 голос
/ 09 сентября 2008

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

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

Я попытался загрузить простой документ через:

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

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

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

1 голос
/ 09 сентября 2008

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

<?xml version='1.0' encoding='UTF-8'?>
<!-- Queries used: ... -->
<dataset>
  ...
</dataset>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...