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

StackOverflow https://stackoverflow.com/questions/774192

  •  13-09-2019
  •  | 
  •  

Вопрос

Я видел 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/> дочерний элемент (от ТСтампер ниже):

 <book>
     <title>Beowulf</title>
     <author><null/></author>
 </book>

Существует ли правильный или канонический способ представить такой null ценить?Есть ли дополнительные способы, кроме приведенных выше примеров?

XML для приведенных выше примеров является надуманным, поэтому не вдавайтесь в него слишком глубоко.:)

Это было полезно?

Решение

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

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

От: W3C

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

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

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

Другие советы

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

Это зависит от того, как вы проверяете свой XML.Если вы используете проверку XML-схемы, правильный способ представления 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-схема:Структуры представляют собой механизм для сигнализации того, что элемент должен быть принят как ·valid· когда у него нет содержания, несмотря на тип контента, который не требует или даже обязательно допускает пустой содержание.Элемент может быть ·valid· без содержимого, если у него есть атрибут 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, например:в ГеоСкиМЛ:

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top