Как правильно представлять нулевые элементы XML? - PullRequest
154 голосов
/ 21 апреля 2009

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

Элемент присутствует с xsi:nil="true":

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

Элемент присутствует, но представлен как пустой элемент (что я считаю неправильным, поскольку 'empty' и 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 для приведенных выше примеров придуман, так что не читайте слишком подробно. :)

Ответы [ 7 ]

108 голосов
/ 21 апреля 2009

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

Если используется пустой тег, getElementValue () возвращает пустую строку ("") Если тег опущен, то никакого авторского тега даже нет. Это может семантически отличаться от установки значения «nil» (например, установка «Series» в значение «nil» может означать, что книга не принадлежит ни одной серии, а пропуск серии может означать, что ряд является неприменимым элементом к текущему элементу.)

От: W3C

Схема XML: структуры вводят механизм сигнализации о том, что элемент должен быть принят как · действительный · когда он не имеет содержания, несмотря на тип контента, который не требует или даже обязательно разрешить пустой контент. Элемент может быть · действительным · без содержание, если оно имеет атрибут xsi: nil со значением true. элемент с меткой должен быть пустым, но может нести атрибуты, если это разрешено соответствующий комплексный тип.

уточнение:
Если у вас есть элемент book xml и один из дочерних элементов - book: series, у вас есть несколько вариантов его заполнения:

  1. Полное удаление элемента - это можно сделать, если вы хотите указать, что серия не относится к этой книге или эта книга не является частью серии. В этом случае преобразования xsl (или другие процессоры, основанные на событиях), имеющие шаблон, соответствующий book: series, никогда не будут вызваны. Например, если ваш xsl превращает элемент книги в строку таблицы (xhtml: tr), вы можете получить неправильное количество ячеек таблицы (xhtml: td), используя этот метод.
  2. Оставить элемент пустым - это может указывать на то, что серия "" или неизвестна, или что книга не является частью серии. Будет вызван любой xsl-преобразователь (или другой когда-либо основанный парсер), который соответствует book: series. Значение current () будет "". Используя этот метод, вы получите то же количество тегов xhtml: td, что и в следующем описанном.
  3. Использование xsi: nil = "true" - это означает, что элемент book: series имеет значение NULL, а не просто пустой. Будет вызван ваш xsl-преобразователь (или другой анализатор на основе событий), у которого есть шаблон, соответствующий book: series. Значение current () будет пустым (не пустая строка). Основное различие между этим методом и (2) состоит в том, что в схеме типа book: series не нужно указывать пустую строку ("") в качестве допустимого значения. Это не имеет никакого смысла для элемента серии, но для элемента языка, который определен как перечислимый тип в схеме, xsi: nil = "true" позволяет элементу не иметь данных. Другим примером могут быть элементы типа decimal. Если вы хотите, чтобы они были пустыми, вы можете объединить перечислимую строку, которая допускает только "" и десятичную дробь, или использовать десятичную дробь с нулем.
9 голосов
/ 23 апреля 2009

Канонического ответа не существует, так как у XML принципиально нет нулевой концепции. Но я предполагаю, что вы хотите сопоставление Xml / Object (поскольку графы объектов имеют нулевые значения); так что ответ для вас "все, что использует ваш инструмент". Если вы пишете обработку, это означает, что вы предпочитаете. Для инструментов, использующих XML-схему, xsi:nil - это путь. Для большинства картографов пропуск соответствующего элемента / атрибута является способом сделать это.

8 голосов
/ 21 апреля 2009

Это зависит от того, как вы проверяете ваш XML. Если вы используете проверку XML-схемы, правильный способ представления значений null - с атрибутом xsi:nil.

[ Источник ]

6 голосов
/ 01 мая 2009

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

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

говорит, что это рекомендуемые формы.

<test></test>
<test/>

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

XML-схема: Structures представляет механизм для сигнализации о том, что элемент должен быть принят как · действительный · , когда он не имеет содержимого, несмотря на тип контента, который не требует или даже обязательно разрешает пустой содержание. Элемент может быть · действительным · без содержимого, если он имеет атрибут 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>
4 голосов
/ 23 апреля 2009

Простое пропускание атрибута или элемента хорошо работает в менее формальных данных.

Если вам нужна более сложная информация, схемы GML добавляют атрибут nilReason, например: в GeoSciML :

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

Когда вы обмениваетесь данными, роль, для которой обычно используется XML, данные, отправленные одному получателю или для определенной цели, могут скрывать содержимое, которое было бы доступно кому-то другому, кто заплатил или имел другую аутентификацию. Знание причины пропажи контента может быть очень важным.

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

4 голосов
/ 22 апреля 2009

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

2 голосов
/ 21 апреля 2009

Во многих случаях целью значения Null является использование значения данных, которого не было в предыдущей версии вашего приложения.

Допустим, у вас есть XML-файл из приложения «ReportMaster» версии 1.

Теперь в ReportMaster версии 2 добавлено еще несколько атрибутов, которые могут быть или не быть определены.

Если вы используете представление 'no tag означает null', вы получаете автоматическую обратную совместимость для чтения вашего XML-файла ReportMaster 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...