Pergunta

Eu vi elementos null representados de várias maneiras:

O elemento está presente com xsi:nil="true":

 <book>
     <title>Beowulf</title>
     <author xsi:nil="true"/>
 </book>

O elemento está presente, mas representado como um elemento vazio (que eu acredito que é errado, uma vez 'vazio' e null são semanticamente diferente):

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

 <!-- or: -->
 <book>
     <title>Beowulf</title>
     <author></author>
 </book>

O elemento não está presente em tudo na retornou marcação :

 <book>
     <title>Beowulf</title>
 </book>

O elemento tem um elemento <null/> criança (de TStamper abaixo):

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

Existe uma maneira correta, ou canônica para representar um tal valor null? Existem maneiras adicionais do que os exemplos acima?

O XML para os exemplos acima é planejado, então não ler muito longe para ele. :)

Foi útil?

Solução

xsi: nil é a maneira correta para representar um valor tal que: Quando o DOM Nível 2 chamada getElementValue () é emitido, o valor NULL é retornado. xsi:. nil também é usado para indicar um elemento válido com nenhum conteúdo, mesmo que os elementos tipo de conteúdo normalmente não permite que elementos vazios

Se uma tag vazia é usado, getElementValue () retorna a string vazia ( "") Se a marca for omitida, então não há tag autor é ainda presente. Isso pode ser semanticamente diferente do que defini-lo como 'nulo' (Ex. Setting "Series" a zero pode ser que o livro pertence a nenhuma série, enquanto a série omitindo poderia significar que a série é um elemento inaplicável ao elemento atual.)

De: O W3C

XML Schema: Estruturas introduz um mecanismo para sinalizar que um elemento deve ser aceito como · válida · quando ele não tem conteúdo, apesar de uma tipo de conteúdo que não exige ou mesmo necessariamente permitir que o conteúdo vazio. Um elemento pode ser · válida · sem conteúdo se ele tem o atributo xsi: nil com o valor verdadeiro. A elemento assim marcado tem de estar vazio, mas pode transportar atributos se permitido pela o tipo complexo correspondente.

Um esclarecimento:
Se você tem um elemento de livro xml e um dos elementos-filho é o livro: série que você tem várias opções quando preenchê-lo:

  1. A remoção do elemento inteiramente - Isso pode ser feito quando se deseja indicar que a série não se aplica a este livro ou aquele livro não é parte de uma série. Em Isto transforma caso XSL (ou outros processadores baseados em eventos) que têm um modelo que partidas livro: série nunca será chamado. Por exemplo, se o seu XSL transforma o elemento livro em linha da tabela (xhtml: tr) você pode obter o número incorreto de células da tabela (xhtml: td). Utilizando este método
  2. Deixando o elemento vazio - Isso pode indicar que a série é "", ou é desconhecido, ou que o livro não é parte de uma série. Qualquer transformação XSL (ou outro analisador com base evernt) que partidas livro: série será chamado. O valor de corrente () será "". Você vai ter o mesmo número de xhtml:. Tags td usando este método como com a próxima descreveu um
  3. Usando xsi: nil = "true" - isso significa que o livro: elemento série é nulo, não apenas esvaziar. Sua transformação XSL (ou outro analisador baseado em eventos) que tem um livro modelo Coincidindo: série será chamado. O valor de corrente () estará vazia (string não vazia). A principal diferença entre este método e (2) é que o tipo de esquema do livro: série não precisa permitir que a cadeia vazia ( "") como um valor válido. Isso não faz sentido real para um elemento de série, mas para um elemento de linguagem que é definido como um tipo enumerado no esquema, xsi: nil = "true" permite que o elemento não ter dados. Outro exemplo seria o tipo de elementos decimal. Se você quer que eles sejam esvaziar possível união uma string enumerou que só permite "" e um decimal, ou usar um decimal que é anulável.

Outras dicas

Não há uma resposta canónica, uma vez que XML tem fundamentalmente nenhum conceito nulo. Mas eu suponho que você quer de mapeamento XML / Objeto (desde gráficos de objetos têm valores nulos); Portanto, a resposta para você é "o que quer que seus usos de ferramentas". Se você escrever a manipulação, o que significa que você preferir. Para ferramentas que usam XML Schema, xsi:nil é o caminho a percorrer. Para a maioria dos cartógrafos, omitindo elemento correspondente / atributo é a maneira de fazê-lo.

Depende de como você validar seu XML. Se você usar a validação de XML Schema, a maneira correta de representar valores null é com o atributo xsi:nil.

[ Fonte ]

A documentação no link de w3

http://www.w3.org/TR/REC-xml / # sec-starttags

diz que isso são as formas recomendados.

<test></test>
<test/>

O atributo mencionado na outra resposta é mecanismo de validação e não uma representação de estado. Consulte a http://www.w3.org/TR/xmlschema-1/ #xsi_nil

Schema XML: Estruturas introduz um mecanismo para sinalizar que um elemento deve ser aceito como · válida · quando ele não tem conteúdo, apesar de uma tipo de conteúdo que não exige ou mesmo necessariamente permitir vazia conteúdo. Um elemento pode ser · válida · sem conteúdo se tiver o atributo xsi: nil com o valor verdadeiro. Um elemento tão rotulado deve ser esvaziar , mas pode transportar atributos se permitido pela correspondente tipo complexo.

Para esclarecer esta resposta: Conteúdo

  <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>

Você usa xsi:nil quando sua semântica esquema indicam que um elemento tem um valor padrão, e que o valor padrão deve ser usado se o elemento não está presente. Eu tenho que assumir que há pessoas inteligentes a quem a sentença anterior não é uma idéia evidentemente terrível, mas parece que nove tipos de ruim para mim. Cada formato XML que eu já trabalhei com representa valores nulos por omitir o elemento. (Ou atributo, e boa marcação um atributo com xsi:nil sorte.)

Simplesmente omitindo o atributo ou elemento funciona bem em dados menos formais.

Se precisar de informações mais sofisticado, os esquemas GML adicionar o atributo nilReason, por exemplo: em GeoSciML :

  • xsi:nil com um valor de "verdadeiro" é usado para indicar que nenhum valor está disponível
  • nilReason pode ser usado para gravar informações adicionais para valores em falta; esta pode ser uma das razões GML padrão (missing, inapplicable, withheld, unknown), ou o texto anexado por other:, ou pode ser um link URI para uma explicação mais detalhada.

Quando você está trocando dados, o papel para o qual XML é comumente usado, os dados enviados para um destinatário ou para um determinado fim podem ter conteúdo obscurecida que estaria disponível para alguém que pagou ou teve de autenticação diferente. Sabendo a razão pela qual o conteúdo estava faltando pode ser muito importante.

Os cientistas também estão preocupados com o porquê de informações está faltando. Por exemplo, se ela foi abandonada por razões de qualidade, eles podem querer ver os dados ruim originais.

Em muitos casos, a propósito de um valor nulo é servir para um valor de dados que não estava presente em uma versão anterior do seu aplicativo.

Então, digamos que você tenha um arquivo xml a partir da aplicação "ReportMaster" versão 1.

Agora, em ReportMaster versão 2 a alguns mais atributos foram adicionados que podem ou não ser definido.

Se você usar a representação 'nenhum meio tag null' você começa a compatibilidade automática para trás para ler o arquivo xml ReportMaster 1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top