Я видел элементы 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 для приведенных выше примеров надуман, поэтому не читайте слишком далеко.:)
xsi: nil - это правильный способ представления такого значения, что: Когда вызывается метод getElementValue() уровня DOM уровня 2, возвращается значение NULL. xsi: nil также используется для указания допустимого элемента без содержимого, даже если этот тип содержимого элементов обычно не допускает пустых элементов.
Если используется пустой тег, getElementValue() возвращает пустую строку ("") Если тег опущен, то никакой тег автора даже не присутствует. Это может быть семантически отличным от того, чтобы установить его на "nil" (пример установки "Series" на nil может заключаться в том, что книга не принадлежит ни одной серии, в то время как опуская серию может означать, что серия является неприменимым элементом для текущего элемента.)
От: W3C
XML-схема: структуры создают механизм сигнализации о том, что элемент должен быть принят как · действительный · когда он не имеет содержания, несмотря на тип содержимого, который не требует или даже обязательно разрешить пустое содержимое. Элемент может быть · действительным · без содержимое, если оно имеет атрибут xsi: nil со значением true. элемент, помеченный таким образом, должен быть пустым, но может переносить атрибуты, если это разрешено соответствующий сложный тип.
Прояснение:
Если у вас есть элемент xml книги, а один из дочерних элементов - это книга: серия у вас есть несколько вариантов при заполнении:
Канонического ответа нет, так как XML принципиально не имеет нулевого понятия.
Но я предполагаю, что вы хотите Xml/Object mapping (поскольку графы объектов имеют значения NULL); поэтому ответ для вас "независимо от того, что использует ваш инструмент". Если вы пишете обработку, это означает, что вы предпочитаете. Для инструментов, использующих XML-схему, xsi:nil
- это путь. Для большинства mappers исключение соответствующего элемента/атрибута - способ сделать это.
Это зависит от того, как вы проверяете свой XML. Если вы используете проверку XML Schema, правильный способ представления значений null
имеет атрибут xsi:nil
.
[Источник]
Документация по ссылке 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. Элемент, помеченный таким образом, должен быть empty, но может переносить атрибуты, если это разрешено соответствующими сложный тип.
Чтобы прояснить этот ответ: содержание
<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
.)
date
не очень помогает, поскольку приложение не будет знать, где на титульной странице вы хочу, чтобы дата появилась. (Если опущенный элемент имеет только одно возможное местоположение, это не проблема; в реальных словарях документов почти все элементы имеют много возможных мест.)
Простое удаление атрибута или элемента хорошо работает в менее формальных данных.
Если вам нужна более сложная информация, схемы GML добавляют атрибут nilReason, например: в GeoSciML:
xsi:nil
со значением "true" используется, чтобы указать, что значение не доступноnilReason
может использоваться для записи дополнительной информации о недостающих значениях; это может быть одной из стандартных причин GML (missing, inapplicable, withheld, unknown
) или текста, добавленного other:
, или может быть ссылкой URI для более подробного объяснения.Когда вы обмениваетесь данными, роль, для которой обычно используется XML, данные, отправленные одному получателю или для определенной цели, могут иметь скрытый контент, доступный кому-то другому, кто заплатил или имел другую аутентификацию. Знать причину отсутствия контента может быть очень важным.
Ученые также обеспокоены тем, почему информация отсутствует. Например, если он был отброшен по соображениям качества, они могут захотеть увидеть исходные плохие данные.
Во многих случаях целью значения Null должно служить значение данных, отсутствовавшее в предыдущей версии вашего приложения.
Скажем, у вас есть xml файл из вашего приложения "ReportMaster" версии 1.
Теперь в версии ReportMaster 2 добавлено еще несколько атрибутов, которые могут быть определены или не определены.
Если вы используете представление "no tag означает null", вы получаете автоматическую обратную совместимость для чтения вашего xml файла ReportMaster.
xmlns:xsi="http://w3.org/2001/XMLSchema-instance"
. Обратите внимание на отсутствующий http: //. Это важно, потому что строка пространства имен на самом деле является просто строкой для парсера xml, а не URI.