XSD: Jaka jest różnica między xs: integer i xs: int?

111

Zacząłem tworzyć XSD i znalazłem w kilku przykładach dla xs:integeri xs:int.

Jaka jest różnica między xs:integeri xs:int? Kiedy powinienem używać xs:integer? Kiedy powinienem używać xs:int?

Michael
źródło

Odpowiedzi:

110

Różnica jest następująca: xs:intjest 32-bitową liczbą całkowitą ze znakiem. xs:integerjest nieograniczoną wartością całkowitą. Szczegółowe informacje można znaleźć pod adresem https://web.archive.org/web/20151117073716/http://www.w3schools.com/schema/schema_dtypes_numeric.asp Na przykład XJC (Java) generuje Integerdla xs:inti BigIntegerdla xs:integer.

Podsumowując: użyj, xs:intjeśli chcesz pracować na różnych platformach i upewnij się, że Twoje liczby przejdą bez problemu. Jeśli chcesz większe liczby - użyj xs:longzamiast xs:integer(zostanie wygenerowany do Long).

Michael
źródło
2
Saxon 9 HE (Home Edition) obsługuje tylko 'xs: integer , but not xs: int` lub xs:long.
Nishi
13
w3cshools nie jest autorytatywny. Dlaczego nie odwołać się do właściwych definicji? w3.org/2001/XMLSchema.xsd stwierdza, że ​​liczba całkowita jest na przykład ograniczona do +/- 9223372036854775808. Ponadto wieloplatformowość nie ma nic wspólnego z (zgodnym) plikiem XML.
Paul Hargreaves,
@Nishi, brzmi jak Saxon 9 HE nie jest zgodny. Czytając stronę saxon.sourceforge.net wydaje się, że tylko wersja EE jest zgodna.
Paul Hargreaves,
2
@PaulHargreaves, Saxon 9 HE jest (o ile wiem) jest w pełni zgodny procesor XSLT: xs: int nie jest w zestawie typów podstawowy procesor XSLT jest wymagane do wsparcia . Jeśli masz na myśli, że nie jest to zgodny z wymaganiami procesor XSD, to prawda, ale wprowadza w błąd: to wcale nie jest procesor XSD.
CM Sperberg-McQueen
8
@PaulHargreaves, Twój komentarz dotyczący +/- 9223372036854775808 będącego maksimum „xs: integer” jest nieprawidłowy: XMLSchema.xsd definiuje, że „xs: long” jest ograniczeniem „xs: integer” do +/-
9223372036854775808
30

Typ xs: integer jest ograniczeniem xs: decimal, z aspektem fractionDigits ustawionym na zero i spacją leksykalną, która zabrania kropki dziesiętnej i końcowych zer, które w innym przypadku byłyby dozwolone. Nie ma wartości minimalnej ani maksymalnej, chociaż implementacje działające na maszynach o skończonych rozmiarach nie muszą być w stanie zaakceptować dowolnie dużych lub małych wartości. (Wymagane są do obsługi wartości z 16 cyframi dziesiętnymi).

Typ xs: int to ograniczenie xs: long, z aspektem maxInclusive ustawionym na 2147483647, a aspektem minInclusive na -2147483648. (Jak widać, zmieści się dogodnie w 32-bitowym polu liczby całkowitej ze znakiem z dwoma uzupełnieniami; xs: long pasuje do 64-bitowego pola ze znakiem liczby całkowitej).

Zwykła zasada brzmi: użyj tego, który pasuje do tego, co chcesz powiedzieć. Jeśli ograniczenie elementu lub atrybutu polega na tym, że jego wartość musi być liczbą całkowitą, xs: integer mówi to zwięźle. Jeśli ograniczenie polega na tym, że wartość musi być liczbą całkowitą, która może być wyrażona za pomocą maksymalnie 32 bitów w reprezentacji z uzupełnieniem do dwóch, użyj xs: int. (Drugorzędna, ale czasami ważna kwestia dotyczy tego, czy łańcuch narzędzi działa lepiej z jednym narzędziem niż z drugim. W przypadku danych, które będą trwać dłużej niż łańcuch narzędzi, warto najpierw wysłuchać danych; w przypadku danych, które istnieją wyłącznie po to, aby zasilić narzędzie łańcuch, a który nie będzie interesujący, jeśli zmienisz łańcuch narzędzi, nie ma powodu, aby nie słuchać łańcucha narzędzi).

CM Sperberg-McQueen
źródło
Wy: implementacje działające na maszynach o skończonych rozmiarach nie muszą [...] Czy norma wymaga, aby implementacje działające na nieskończonych maszynach (takich jak maszyny Turinga i inne) akceptowały i właściwie reprezentowały pełny zakres? :-) Byłoby fajnie, bo wszechświat, przy znanych obecnie prawach fizyki, nie dopuszcza takich maszyn.
Jeppe Stig Nielsen
Nie, specyfikacja nie ma specjalnych reguł dla implementacji działających na nieskończonych maszynach; wszystkie implementacje mogą korzystać z reguł rządzących częściową implementacją nieskończonych typów danych.
CM Sperberg-McQueen
6

Dodałbym tylko nutę pedanterii, która może być ważna dla niektórych ludzi: nie jest poprawne stwierdzenie, że xs: int „jest” 32-bitową liczbą całkowitą ze znakiem. Ta forma słów implikuje implementację w pamięci (lub rejestrach itp.) W binarnym komputerze cyfrowym. XML jest oparty na znakach i zaimplementowałby maksymalną 32-bitową wartość ze znakiem jako „2147483647” (oczywiście moje cudzysłowy), czyli o wiele więcej niż 32 bity! Prawdą jest, że xs: int jest (pośrednio) ograniczeniem xs: integer, które ustawia maksymalne i minimalne dozwolone wartości na takie same, jak odpowiadające im limity narzucone przez implementację 32-bitowej liczby całkowitej z bitem znaku.

PeteCahill
źródło
Nie ma gwarancji, że źródłowy zestaw informacji zweryfikowany za pomocą XSD ma postać sekwencji znaków; jeśli schemat jest używany do walidacji instancji dokumentu skonstruowanej za pomocą XSLT lub XQuery, istnieje wszelkie prawdopodobieństwo, że wartość xs: int może być reprezentowana w pamięci przy użyciu konwencjonalnej reprezentacji 32-bitowych liczb całkowitych.
CM Sperberg-McQueen
@ CMSperberg-McQueen, nie jestem pewien, czy rozumiem twój punkt widzenia. xs: int jest typem z zakresem, sposób jego przechowywania jest nieistotny dla XSD i wszystko, co twarde kody „int” jako 32-bitowa liczba całkowita ze znakiem w pamięci, prosi o problemy, jeśli na przykład zostanie wybrany inny XSD, który mówi int ma zakres inny niż zakres zdefiniowany w XSD w3c.
Paul Hargreaves,
1
@PaulHargreaves to nieco pedantyczny punkt (w duchu odpowiedzi). Odpowiedź jest prawidłowa, że ​​nie jest poprawne stwierdzenie, że xs: int jest 32-bitową liczbą całkowitą z dopełnieniem do dwóch ze znakiem. Ale odpowiedź mówi również, że ponieważ XML jest oparty na znakach, maksymalna wartość xs: int to ciąg znaków „2147483647”; to ostatnie niekoniecznie jest takie. Typy XSD są używane przez wiele systemów, np. Bazy danych XQuery, w których wartość xs: int jest bardziej prawdopodobna do reprezentacji w 32-bitowym polu z dopełnieniem do dwóch niż jako ciąg znaków Unicode.
CM Sperberg-McQueen
użyj „reprezentuje” zamiast „jest”
Chris Walsh