Пустые элементы для простых типов данных запрещены в XSD - PullRequest
2 голосов
/ 18 февраля 2011

Я обнаружил ошибку синтаксического анализа в Apache CXF при обработке ответа веб-службы.Это означает, что возвращается пустой элемент:

<myValue />

Определение элемента выглядит следующим образом:

<xsd:element name="myValue" type="xsd:float" minOccurs="0">

Теперь я прочитал в списке рассылки CXF, что пустое значение не разрешено спецификацией XSD :

Что ж, для этого нет обходного пути, поскольку это не ошибка.Пустой элемент недопустим для любого типа Decimal или Date или чего-либо подобного.
Таким образом, он ДОЛЖЕН вызвать исключение.
Что вы ожидаете от него?

Теперь здесьвозникает вопрос: где именно я могу найти это ограничение в спецификации XML-схемы?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2011

Где именно я могу найти это ограничение в спецификации XML-схемы?

http://www.w3.org/TR/xmlschema-2/#float-lexical-representation

значения с плавающей точкой имеют лексическое представление, состоящее из мантиссысопровождаемый, необязательно, символом «E» или «e», за которым следует показатель степени.
...
Представления для показателя степени и мантиссы должны следовать лексическим правилам для целых и десятичных чисел.
...
Специальные значения положительной и отрицательной бесконечности и не-числа имеют лексические представления INF, -INF и NaN, соответственно.

Так что xs:float требует по крайней мере мантиссу, которая являетсяxs:decimal ...

Десятичное число имеет лексическое представление, состоящее из последовательности десятичных цифр конечной длины (# x30- # x39), разделенных точкой в ​​качестве десятичного индикатора.Допускается необязательный начальный знак.

... и пустая строка недопустима xs:decimal.

Если у вас нет значения для этого элемента, выследует попытаться не включать этот элемент, если это возможно.Кажется, ваша схема позволяет пропустить этот элемент, потому что minOccurs имеет значение 0.Другое решение было бы вставить подходящее значение замены, например 0 или NaN.

0 голосов
/ 21 июня 2012

Это не окончательное ограничение. Вы должны быть в состоянии изменить свой xsd на

<xsd:element name="myValue" type="xsd:float" minOccurs="0" default="0" />

А затем сможете предоставить пустой элемент для вашего float, не делая ваш XML недействительным.

Приведенный выше пример означает, что если элемент пуст, то его значение равно 0. Осторожно, атрибут по умолчанию не применяется к отсутствующим элементам: отсутствующие элементы просто отсутствуют, независимо от того, имеют они объявленные значения по умолчанию или нет. http://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints

если элемент отображается без какого-либо содержимого, процессор схемы предоставляет элементу значение, равное значению атрибута по умолчанию. Однако, если элемент не отображается в экземпляре документа, процессор схемы вообще не предоставляет этот элемент.

Я не использовал это до сих пор, но для защиты от личного неправильного чтения спецификаций w3c я проверил с помощью онлайн-валидатора, что xml с пустым элементом xs: float, имеющим значение по умолчанию, было принято (по крайней мере, этот онлайн-валидатор: http://www.freeformatter.com/xml-validator-xsd.html).

...