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

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

От: W3C

Схема XML: Structures представляет механизм для оповещения о том, что элемент должен быть принят как · действительный ·, когда у него нет контента, несмотря на тип контента, который не требует или даже обязательно допускает пустой контент. Элемент может быть · действительным · без содержимого, если он имеет атрибут 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. Если вы хотите, чтобы они были пустыми, вы можете объединить перечислимую строку, которая допускает только "" и десятичную дробь, или использовать десятичную дробь, которая допускает ноль.
KitsuneYMG
источник
11
Использование xsi: nil правильно, но вы должны убедиться, что оно находится в правильном пространстве имен: xmlns: xsi = " w3.org/2001/XMLSchema-instance "
STW
Это на самом деле xmlns:xsi="http://w3.org/2001/XMLSchema-instance". Обратите внимание на отсутствующий http: //. Это важно, потому что строка пространства имен на самом деле является строкой для парсера xml, а не URI.
Бурак Арслан
9
Хех, я считаю, что это все еще немного неправильно. Так и должно быть xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance". Примечание "www." См. W3.org/TR/xmlschema-1/#no-xsi
Янне Маттила
Как указано в моем ответе, я не согласен с интерпретацией, поскольку это не представление о состоянии элемента, а ограничение на использование элемента
Oakcool
2
@ChrisV: не правда, xsi:префикс должен быть объявлен. Анализатор XML с поддержкой пространства имен отклонит ваш XML-документ, если вы попытаетесь использовать xsi:префикс, не объявив его. Соответствующей спецификацией здесь является w3.org/TR/xml-names/#nsc-NSDeclared («Ограничение пространства имен: объявлен префикс»), в котором говорится, что единственными предопределенными префиксами являются xml:и xmlns:. Схема XML построена на основе спецификации пространств имен XML, но не добавляет к ней никаких дополнительных предопределенных префиксов, поскольку это фактически нарушает спецификацию пространств имен XML.
Саймон Киссейн
9

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

StaxMan
источник
8

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

[ Источник ]

Tormod Fjeldskår
источник
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>
Oakcool
источник
7
Это рекомендация для пустых элементов; Вы считаете, что пустой === ноль? Я полагаю, что между этими двумя понятиями есть разница, хотя часто это ситуативно. Если вы делаете заявление, что они одинаковы, я бы рекомендовал упомянуть этот аргумент в вашем ответе.
Роб Хруска
1
Пустой не то же самое, что ноль; если бы это было так, этот вопрос о стековом потоке никогда бы не был задан. Этот ответ неверен. Однако программист должен определить, готова ли логика, которая будет читать xml, обрабатывать отсутствующий элемент или xsi: nil; если нет, возможно, потребуется использовать одну из этих форм; то есть может быть необходимо потерять различие между нулевым / отсутствующим элементом и пустым элементом.
ToolmakerSteve
@RobHruska да, вы правы, это определение пустого элемента, но если принять во внимание определение W3C, на которое указывает KitsuneYMG, оно определяет, что элемент должен быть нулевым, и я считаю, что это представление является скорее определением пометьте затем представление его текущего состояния, поэтому я не согласен с этим ответом и считаю, что пустое является лучшим представлением нулевого элемента. Идея проста, чтобы поддерживать хорошую структуру, вам нужно, чтобы все элементы были представлены, иначе вы бы не знали о его существовании, и, следовательно, могли бы исказить его.
Oakcool
4

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

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

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

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

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

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

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

Энди Дент
источник
2

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

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

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

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

Йерун Диркс
источник