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

138

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

Теги:
null
xml-nil

7 ответов

99
Лучший ответ

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

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

От: W3C

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

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

  • Удаление элемента целиком - это можно сделать, если вы хотите указать, что серия не относится к этой книге или эта книга не входит в серию. В этом случае xsl преобразует (или другие процессоры на основе событий), у которых есть шаблон, который соответствует букве: серия никогда не будет вызываться. Например, если ваш xsl превращает элемент книги в строку таблицы (xhtml: tr), вы можете получить неправильное количество ячеек таблицы (xhtml: td) с помощью этого метода.
  • Оставить элемент пустым - это может означать, что серия ", или неизвестна, или что книга не входит в серию. Будет вызываться любое преобразование xsl (или другой вещественный парсер), соответствующий строке book: series. Значение current() будет" ". Вы получите такое же количество тэгов xhtml: td, используя этот метод, как со следующим описанным.
  • Использование xsi: nil = "true" - это означает, что элемент book: series имеет значение NULL, а не только пустое. Будет вызываться ваше преобразование xsl (или другой парсер, основанный на событиях), в котором есть шаблон, соответствующий книге: серия. Значение current() будет пустым (не пустая строка). Основное различие между этим методом и (2) заключается в том, что для типа схемы book: series не требуется пустая строка ("") в качестве допустимого значения. Это не имеет никакого смысла для элемента серии, но для языкового элемента, который указан как перечисляемый тип в схеме, xsi: nil = "true" позволяет элементу не иметь данных. Другим примером могут быть элементы типа decimal. Если вы хотите, чтобы они были пустыми, вы можете объединить перечисляемую строку, которая разрешает только "" и десятичную, или использовать десятичную цифру, которая является nillable.
  • 11
    Использование xsi: nil правильно, но вы должны убедиться, что оно находится в правильном пространстве имен: xmlns: xsi = " w3.org/2001/XMLSchema-instance "
  • 0
    На самом деле это xmlns:xsi="http://w3.org/2001/XMLSchema-instance" . Обратите внимание на отсутствующий http: //. Это важно, потому что строка пространства имен на самом деле является просто строкой для парсера xml, а не URI.
Показать ещё 4 комментария
9

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

8

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

[Источник]

5

Документация по ссылке 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>
  • 7
    Это рекомендация для пустых элементов; вы считаете, что пусто === ноль? Я полагаю, что между этими двумя понятиями есть разница, хотя это часто бывает ситуативным. Если вы делаете заявление, что они одинаковы, я бы рекомендовал упомянуть этот аргумент в вашем ответе.
  • 0
    Пустой не то же самое, что ноль; если бы это было так, этот вопрос о стековом потоке никогда бы не был задан. Этот ответ неверен. Однако программист должен определить, готова ли логика, которая будет читать xml, обрабатывать отсутствующий элемент или xsi: nil; в противном случае, возможно, будет необходимо использовать одну из этих форм; то есть может быть необходимо потерять различие между нулевым / отсутствующим элементом и пустым элементом.
Показать ещё 1 комментарий
4

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

  • 0
    Если в приложении для публикации документов вы хотите, чтобы дата на титульном листе по умолчанию равнялась текущей дате, если у элемента нет содержимого, полное исключение элемента date не очень помогает, поскольку приложение не будет знать, где на титульной странице вы хочу, чтобы дата появилась. (Если опущенный элемент имеет только одно возможное местоположение, это не проблема; в реальных словарях документов почти все элементы имеют много возможных мест.)
3

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

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

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

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

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

2

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню