Разница в XML при использовании [] в конце! DOCTYPE? - PullRequest
0 голосов
/ 13 ноября 2018

Как вы можете видеть в связанном вопросе, при использовании XDocument в C # в DTD-заголовок будет добавлено пустое внутреннее подмножество [], если не существовало ранее.Вопрос и ответ касаются того, как удалить это, однако , в то время как ответчик указывает, что это хорошо отформатированный XML, я спрашиваю:

1) При каких обстоятельствахэто вызовет проблемы?Какой стандарт изменился, чтобы устаревшее приложение могло быть несовместимо с пустым внутренним подмножеством?

2) Является ли предпочтительным использование пустых внутренних подмножеств в будущем с новыми приложениями?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Это немного странно, но не неправильно.

Грамматика для DOCTYPE:

doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'   
intSubset   ::= (markupdecl | DeclSep)*

Итак, вам разрешена последовательность объявлений разметки ноль или более между квадратамиквадратные скобки, и если нет никаких объявлений разметки, то вы можете опустить квадратные скобки (но это не обязательно).

0 голосов
/ 13 ноября 2018

Когда вы анализируете XML-документ с помощью XDocument с DTD, тогда пустое значение Internal Subset означает, что квадратные скобки [] автоматически вставляются.

Если вы хотите удалить это Internal Subset, вы можете установить XDocumentType.InternalSubset = null как

XDocument doc = XDocument.Load(@"Path to xml file");
if (doc.DocumentType != null)
    doc.DocumentType.InternalSubset = null;

//Do code with XDocument

Пример:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE book [ <!ENTITY h "hardcover"> ]>
<book genre="novel" ISBN="1-861001-57-5">  
  <title>Pride And Prejudice</title>
  <author>Mark Henry</author>  
</book>

В приведенном выше примере любезно заметил эту часть [ <!ENTITY h "hardcover"> ]. Это называется внутренним подмножеством.

Имеет ли это значение?

Нет, это не имеет значения. но это правильно сформированный XML, если ваш XML не содержит никакого внутреннего подмножества, он представляется в виде квадратных скобок []. это означает, что ваш xml не содержит никакого внутреннего подмножества.

При синтаксическом анализе xml с XDocument без внутреннего подмножества XDocument добавляет пустые квадратные скобки [] вместо отображения ничего в DOCTYPE.

Что делает пустое внутреннее подмножество?

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

Подробнее о Internal Subset можно прочитать здесь

...