Как правильно представлять нулевые элементы XML?

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

7 ответов


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

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

From:организация W3C

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

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

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

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


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


документация в ссылке 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>

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


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

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

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

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

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


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

Итак, скажем, у вас есть xml-файл из вашего приложения "ReportMaster" версии 1.

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

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