Який правильний спосіб представити нульові XML-елементи?


166

Я бачив nullелементи, представлені кількома способами:

Елемент присутній із xsi:nil="true":

 <book>
     <title>Beowulf</title>
     <author xsi:nil="true"/>
 </book>

Елемент присутній, але представлений як порожній елемент (який, на мою думку, неправильний, оскільки "порожній" і nullсемантично відрізняється):

 <book>
     <title>Beowulf</title>
     <author/>
 </book>

 <!-- or: -->
 <book>
     <title>Beowulf</title>
     <author></author>
 </book>

Елемент взагалі відсутній у поверненій розмітці :

 <book>
     <title>Beowulf</title>
 </book>

У елемента є <null/>дочірній елемент (від TStamper нижче):

 <book>
     <title>Beowulf</title>
     <author><null/></author>
 </book>

Чи є правильний чи канонічний спосіб представити таку nullцінність? Чи є додаткові способи, ніж наведені вище приклади?

XML для наведених вище прикладів надуманий, тому не читайте його занадто далеко. :)

Відповіді:


121

xsi: nil - це правильний спосіб представити таке значення, що: Коли виклик DOM рівня 2 getElementValue () видається, значення NULL повертається. xsi: nil також використовується для вказівки дійсного елемента без вмісту, навіть якщо тип вмісту елементів зазвичай не дозволяє порожні елементи.

Якщо використовується порожній тег, getElementValue () повертає порожню рядок ("") Якщо тег пропущено, то жоден авторський тег навіть не присутній. Це може бути семантично відмінним, ніж встановити його на "нуль" (напр., Встановлення "Серії" на нуль може бути таким, що книга не належить до жодної серії, тоді як опущення серії може означати, що серія є непридатним елементом для поточного елемента.)

Від: W3C

Схема XML: Структури вводять механізм сигналізації того, що елемент повинен бути прийнятий як «дійсний», коли він не має вмісту, незважаючи на тип вмісту, який не вимагає або навіть обов'язково дозволяє пустувати вміст. Елемент може бути · дійсним · без вмісту, якщо він має атрибут xsi: nil зі значенням true. Елемент, позначений таким чином, повинен бути порожнім, але може містити атрибути, якщо це дозволено відповідним складним типом.

Пояснення:
Якщо у вас є елемент xml книги, а одним із дочірніх елементів є book: series, у вас є кілька варіантів при заповненні:

  1. Видалення елемента повністю - Це можна зробити, коли ви хочете вказати, що серія не стосується цієї книги або що книга не є частиною серії. У цьому випадку xsl перетворює (або інші процесори на основі подій), у яких є шаблон, що відповідає книзі: серія ніколи не буде викликана. Наприклад, якщо ваш xsl перетворює елемент книги у рядок таблиці (xhtml: tr), ви можете отримати неправильну кількість комірок таблиці (xhtml: td) за допомогою цього методу.
  2. Залишаючи елемент порожнім - Це може означати, що серія є "" або невідома, або що книга не є частиною серії. Буде викликано будь-яке перетворення xsl (або інший аналізатор на основі evernt), що відповідає книзі: series. Значення current () буде "". Ви отримаєте таку ж кількість тегів xhtml: td, використовуючи цей метод, як і для наступного описаного.
  3. Використання xsi: nil = "true" - Це означає, що елемент "book: series" - NULL, а не просто порожній. Ваша трансформація xsl (або інший аналізатор на основі подій), у якій є книга, що відповідає шаблону: серія буде викликана. Значення current () буде порожнім (не порожнім рядком). Основна відмінність цього методу від (2) полягає в тому, що тип схеми книги: серія не повинен допускати порожній рядок ("") як дійсне значення. Це не має реального сенсу для елемента рядка, але для мовного елемента, який визначається як перерахований тип у схемі, xsi: nil = "true" дозволяє елементу не мати даних. Іншим прикладом можуть бути елементи типу десяткових. Якщо ви хочете, щоб вони були порожніми, ви можете об'єднати перелічену рядок, яка дозволяє лише "" і десятковий знак, або використовувати десятковий знак, який не підлягає введенню.

11
Використання xsi: nil правильне, але ви повинні переконатися, що воно знаходиться у відповідному просторі імен: xmlns: xsi = " w3.org/2001/XMLSchema-instance "
STW

Це насправді xmlns:xsi="http://w3.org/2001/XMLSchema-instance". Зверніть увагу на відсутній http: //. Це важливо, тому що рядок простору імен насправді є лише рядком для аналізу XML, а не урі.
Бурак Арслан

9
Хе, я вважаю, це все ще трохи неправильно. Це повинно бути xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance". Примітка "www.". Дивіться w3.org/TR/xmlschema-1/#no-xsi
Janne Mattila

Як сказано у моїй відповіді, я не погоджуюся з тлумаченням, оскільки це не представлення стану елемента, а обмеження щодо використання елемента
Oakcool

2
@ChrisV: Неправда, xsi:префікс повинен бути оголошений. Аналізатор XML, відомий у просторі імен, відхилить ваш XML-документ, якщо ви спробуєте використати xsi:префікс, не оголошуючи його. Тут є відповідна специфікація w3.org/TR/xml-names/#nsc-NSDeclared ("Обмеження простору імен: оголошено префікс"), де вказано, що єдиними заздалегідь визначеними префіксами є xml:і xmlns:. Схема XML будується поверх специфікації просторів імен XML, але не додає до неї додаткових заздалегідь визначених префіксів, оскільки це фактично порушує специфікацію просторів імен XML.
Саймон Кіссане

9

Канонічної відповіді немає, оскільки XML в принципі не має нульового поняття. Але я припускаю, що ви хочете зіставити Xml / об'єкт (оскільки в графіках об'єктів є нулі); тож відповідь для вас - "що б не використовував ваш інструмент". Якщо ви пишете обробку, це означає все, що вам більше подобається. Інструменти, які використовують схему XML, xsi:nil- це шлях. Для більшості картографів пропущення відповідного елемента / атрибута - це спосіб це зробити.


8

Це залежить від того, як ви підтвердили свій XML. Якщо ви використовуєте перевірку XML-схеми, правильний спосіб подання nullзначень - це xsi:nilатрибут.

[ Джерело ]


7

Документація за посиланням w3

http://www.w3.org/TR/REC-xml/#sec-starttags

каже, що це рекомендовані форми.

<test></test>
<test/>

Атрибут, згаданий в іншій відповіді, - це механізм перевірки, а не подання стану. Зверніться до http://www.w3.org/TR/xmlschema-1/#xsi_nil

Схема XML: Структури вводять механізм сигналізації того, що елемент повинен бути прийнятий як «дійсний», коли він не має вмісту, незважаючи на тип вмісту, який не вимагає або навіть обов'язково дозволяє пустувати вміст. Елемент може бути · дійсним · без вмісту, якщо він має атрибут xsi: nil зі значенням true. Елемент, позначений таким чином, повинен бути порожнім , але може містити атрибути, якщо це дозволено відповідним складним типом.

Щоб уточнити цю відповідь: Зміст

  <Book>
    <!--Invalid construct since the element attribute xsi:nil="true" signal that the element must be empty-->
    <BuildAttributes HardCover="true" Glued="true" xsi:nil="true">
      <anotherAttribute name="Color">Blue</anotherAttribute>
    </BuildAttributes>
    <Index></Index>
    <pages>
      <page pageNumber="1">Content</page>            
    </pages>
    <!--Missing ISBN number could be confusing and misguiding since its not present-->
  </Book>
</Books>

7
Ось рекомендація щодо порожніх елементів; ви вважаєте, що порожній === null? Я вважаю, що між ними є різниця, хоча це часто ситуативно. Якщо ви робите заяву про те, що вони однакові, рекомендую згадати цей аргумент у своїй відповіді.
Роб Грушка

1
Порожня не є такою ж, як null; якби це було, цього питання про stackoverflow ніколи б не задавали. Ця відповідь неправильна. Однак програміст повинен визначити, чи готова логіка, яка буде читати xml, для обробки відсутнього елемента або xsi: nil; якщо ні, то може знадобитися використання однієї з цих форм; тобто може знадобитися втратити відмінність між нульовим / відсутнім елементом та порожнім елементом.
ToolmakerSteve

@RobHruska так, ви маєте рацію, це визначення порожнього елемента, але якщо врахувати визначення W3C, яке вказувало KitsuneYMG, воно визначає, що елемент повинен бути нульовим, і я вважаю, що це представлення більше визначення тег тоді представляє його поточний стан, тому я не згоден з цією відповіддю, і вважаю, що порожнє - найкраще представлення нульового елемента. Ідея проста, щоб підтримувати гарну структуру, потрібно, щоб усі елементи були представлені інакше ви не знали б про її існування, а тому могли б її неправильно представити.
Oakcool

4

Ви використовуєте, xsi:nilколи ваша семантика схеми вказує на те, що для елемента є значення за замовчуванням, і що за умовчанням слід використовувати значення за замовчуванням. Я мушу припустити, що є розумні люди, яким попереднє речення не є само собою очевидною страшною ідеєю, але це звучить як дев'ять видів поганого для мене. Кожен формат XML, з яким я коли-небудь працював, представляє нульові значення, опускаючи елемент. (Або атрибут, і удача відмітити атрибут с xsi:nil.)


Якщо в додатку для публікації документів ви хочете, щоб дата на титульній сторінці за замовчуванням була поточною датою, якщо в елементі немає вмісту, опускання dateелемента цілком не допоможе, оскільки додаток не матиме уявлення, де на титульній сторінці ви хочете дата, яка з’явиться. (Якщо у пропущеного елемента є лише одне можливе розташування, це не проблема; у реальних словникових документах майже всі елементи мають багато можливих локацій.)
CM Sperberg-McQueen

4

Просто опущення атрибута чи елемента добре працює в менш формальних даних.

Якщо вам потрібна більш досконала інформація, схеми GML додають атрибут nilReason, наприклад: у GeoSciML :

  • xsi:nil зі значенням "true" використовується для вказівки, що значення немає
  • nilReasonможе використовуватися для запису додаткової інформації про відсутніх значеннях; це може бути однією зі стандартних причин GML ( missing, inapplicable, withheld, unknown), або текст, попередньо створений other:, або може бути посиланням URI на більш детальне пояснення.

Під час обміну даними, роль, для якої зазвичай використовується XML, дані, надіслані одному одержувачу, або для певної мети, можуть мати затемнення, яке було б доступне іншому, хто платив або мав іншу автентифікацію. Знання причини, через яку не вистачало вмісту, може бути дуже важливим.

Вчених також хвилює питання, чому інформація відсутня. Наприклад, якщо це було скинуто з міркувань якості, вони можуть захотіти переглянути оригінальні погані дані.


2

У багатьох випадках метою значення Null є подання значення даних, яке не було в попередній версії вашої програми.

Тому скажіть, що у вашому додатку "ReportMaster" версія 1 є файл xml.

Тепер у ReportMaster версії 2 додано ще кілька атрибутів, які можуть бути або не визначені.

Якщо ви використовуєте представлення "без тега означає нулеве", ви отримуєте автоматичну зворотну сумісність для читання вашого файлу ReportMaster 1 xml.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.