XSD: Qual é a diferença entre xs: integer e xs: int?

111

Comecei a criar XSD e encontrei alguns exemplos para xs:integere xs:int.

Qual é a diferença entre xs:integere xs:int? Quando devo usar xs:integer? Quando devo usar xs:int?

Michael
fonte

Respostas:

110

A diferença é a seguinte: xs:inté um inteiro de 32 bits com sinal. xs:integeré um valor inteiro ilimitado. Consulte para obter detalhes https://web.archive.org/web/20151117073716/http://www.w3schools.com/schema/schema_dtypes_numeric.asp Por exemplo, XJC (Java) gera Integerpara xs:inte BigIntegerpara xs:integer.

Resumindo: use xs:intse quiser trabalhar em várias plataformas e certifique-se de que seus números passarão sem problemas. Se você quiser números maiores - use em xs:longvez de xs:integer(será gerado para Long).

Michael
fonte
2
Saxon 9 HE (Home Edition) suporta apenas 'xs: inteiro , but not xs: int` ou xs:long.
Nishi
13
w3cshools não é oficial. Por que não fazer referência às definições adequadas? w3.org/2001/XMLSchema.xsd afirma que o número inteiro está vinculado a +/- 9223372036854775808, por exemplo. Além disso, a plataforma cruzada não tem nada a ver com o xml (compatível).
Paul Hargreaves
@Nishi, soa como Saxon 9 HE não está em conformidade. Lendo a página saxon.sourceforge.net , parece que apenas a versão EE é compatível.
Paul Hargreaves
2
@PaulHargreaves, Saxon 9 HE é (até onde eu sei) um processador XSLT totalmente compatível: xs: int não está no conjunto de tipos que um processador XSLT básico deve suportar . Se você quer dizer que não é um processador XSD em conformidade, isso é verdade, mas enganoso: não é um processador XSD.
CM Sperberg-McQueen
8
@PaulHargreaves, seu comentário sobre +/- 9223372036854775808 ser o máximo de "xs: integer" está errado: o XMLSchema.xsd define que um "xs: long" é uma restrição de "xs: integer" a +/- 9223372036854775808
metatechbe
30

O tipo xs: integer é uma restrição de xs: decimal, com a faceta fractionDigits definida como zero e com um espaço léxico que proíbe a vírgula decimal e os zeros finais que, de outra forma, seriam permitidos. Não tem valor mínimo ou máximo, embora as implementações em execução em máquinas de tamanho finito não precisem aceitar valores arbitrariamente grandes ou pequenos. (Eles são obrigados a suportar valores com 16 dígitos decimais.)

O tipo xs: int é uma restrição de xs: long, com a faceta maxInclusive definida como 2147483647 e a faceta minInclusive como -2147483648. (Como você pode ver, ele caberá convenientemente em um campo de inteiro com sinal de 32 bits de dois complementos; xs: long se encaixa em um campo de inteiro com sinal de 64 bits.)

A regra usual é: use aquela que corresponde ao que você quer dizer. Se a restrição em um elemento ou atributo é que seu valor deve ser um inteiro, xs: integer diz isso de forma concisa. Se a restrição for que o valor deve ser um número inteiro que pode ser expresso com no máximo 32 bits na representação de complemento de dois, use xs: int. (Uma preocupação secundária, mas às vezes importante, é se sua cadeia de ferramentas funciona melhor com uma do que com a outra. Para dados que durarão mais do que sua cadeia de ferramentas, é aconselhável ouvir os dados primeiro; para dados que existem apenas para alimentar a ferramenta corrente, e que não terá interesse se você trocar sua corrente de ferramentas, não há razão para não ouvir a corrente de ferramentas.)

CM Sperberg-McQueen
fonte
Você: implementações rodando em máquinas de tamanho finito não são obrigadas a [...] O padrão tem um requisito de que as implementações rodando em máquinas infinitas (como máquinas de Turing e outras coisas) devem aceitar e representar adequadamente a gama completa? :-) Isso seria legal, porque o universo, com as leis da física como são conhecidas atualmente, não admite tais máquinas.
Jeppe Stig Nielsen
Não, a especificação não possui regras especiais para implementações em execução em máquinas infinitas; todas as implementações podem se beneficiar das regras que regem a implementação parcial dos tipos de dados infinitos.
CM Sperberg-McQueen
6

Eu apenas acrescentaria uma nota de pedantismo que pode ser importante para algumas pessoas: não é correto dizer que xs: int "é" um inteiro de 32 bits com sinal. Essa forma de palavras implica uma implementação na memória (ou registros, etc.) dentro de um computador digital binário. XML é baseado em caracteres e implementaria o valor máximo assinado de 32 bits como "2147483647" (minhas citações, é claro), que é muito mais do que 32 bits! O que É verdade é que xs: int é (indiretamente) uma restrição de xs: integer que define os valores máximo e mínimo permitidos como sendo os mesmos que os limites impostos pela implementação correspondentes de um inteiro de 32 bits com um bit de sinal.

PeteCahill
fonte
Não há garantia de que o infoset de origem validado com XSD venha na forma de uma sequência de caracteres; se o esquema for usado para validar uma instância de documento construída por meio de XSLT ou XQuery, existe toda a possibilidade de um valor xs: int ser representado na memória usando a representação convencional para inteiros de 32 bits.
CM Sperberg-McQueen
@ CMSperberg-McQueen, não tenho certeza se entendi seu ponto. xs: int é um tipo com um intervalo, como é armazenado é irrelevante para o XSD e qualquer coisa que codifique "int" como um inteiro assinado de 32 bits na memória está solicitando problemas se, por exemplo, um XSD diferente for escolhido que diz um int tem um intervalo diferente do intervalo definido no w3c XSD.
Paul Hargreaves
1
@PaulHargreaves é um ponto ligeiramente pedante (no espírito da resposta). A resposta está certa: não é correto dizer categoricamente que xs: int é um número inteiro com dois complementos de 32 bits com sinal. Mas a resposta também diz que, como o XML é baseado em caracteres, o valor máximo de xs: int é a cadeia de caracteres "2147483647"; essa última parte não é necessariamente assim. Os tipos XSD são usados ​​por muitos sistemas, por exemplo, bancos de dados XQuery, onde um valor xs: int tem mais probabilidade de ser representado em um campo de complemento duplo de 32 bits do que como uma string de caracteres Unicode.
CM Sperberg-McQueen
use "representa" no lugar de "é"
Chris Walsh