it-swarm.dev

Qual é a maneira correta de representar elementos XML nulos?

Eu vi os 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 acredito estar errado, uma vez que 'empty' e null são semanticamente diferentes):

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

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

O elemento não está presente de todo na marcação retornada :

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

O elemento possui um elemento filho <null/> (de TStamper abaixo):

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

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

O XML para os exemplos acima é inventado, então não leia muito sobre isso. :)

154
Rob Hruska

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

Se uma tag vazia for usada, getElementValue () retorna a string vazia ("") Se a tag for omitida, nenhuma tag de autor estará presente. Isso pode ser semanticamente diferente do que defini-lo como 'nulo' (Ex. Configuração de "Série" para zero pode ser que o livro não pertença a nenhuma série, enquanto omitir séries poderia significar que a série é um elemento inaplicável ao elemento atual).

De: O W3C

Esquema XML: Estruturas introduz um mecanismo para sinalizar que um elemento deve ser aceito como válido quando não tem conteúdo, apesar de um tipo de conteúdo que não requer ou mesmo necessariamente permite conteúdo vazio. Um elemento pode ser válido sem conteúdo se tiver o atributo xsi: nil com o valor true. Um elemento assim rotulado deve estar vazio, mas pode transportar atributos se permitido pelo tipo complexo correspondente.

Um esclarecimento:
Se você tiver um elemento xml de livro e um dos elementos filhos for book: series, você terá várias opções ao preenchê-lo:

  1. Removendo o elemento inteiramente - Isso pode ser feito quando você deseja indicar que a série não se aplica a este livro ou que o livro não faz parte de uma série. Nesse caso, as transformações xsl (ou outros processadores baseados em eventos) que possuem um modelo que corresponde ao book: series nunca serão chamadas. Por exemplo, se o seu xsl transformar o elemento book na linha da tabela (xhtml: tr), você poderá obter o número incorreto de células da tabela (xhtml: td) usando este método.
  2. Deixando o elemento vazio - Isso pode indicar que a série é "", ou é desconhecida, ou que o livro não faz parte de uma série. Qualquer transformação xsl (ou outro analisador baseado em evernt) que corresponda ao book: series será chamado. O valor de current () será "". Você obterá o mesmo número de tags xhtml: td usando esse método, como no próximo exemplo descrito.
  3. Usando xsi: nil = "true" - Isso significa que o elemento book: series é NULL, não apenas vazio. Sua transformação xsl (ou outro analisador baseado em eventos) que possui um modelo correspondente ao book: series será chamada. O valor de current () será vazio (não string vazia). A principal diferença entre esse método e (2) é que o tipo de esquema de book: series não precisa permitir que a string vazia ("") seja 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 tenha dados. Outro exemplo seria elementos do tipo decimal. Se você quiser que eles estejam vazios, você pode unir uma string enumerada que só permite "" e um decimal, ou usar um decimal que é nillable.
108
KitsuneYMG

Não há resposta canônica, já que XML fundamentalmente não possui um conceito nulo. Mas suponho que você queira o mapeamento Xml/Object (já que os gráficos de objeto têm nulos); então a resposta para você é "o que sua ferramenta usa". Se você escreve manuseio, isso significa o que você preferir. Para ferramentas que usam o XML Schema, xsi:nil é o caminho a percorrer. Para a maioria dos mapeadores, omitir elemento/atributo correspondente é a maneira de fazer isso.

9
StaxMan

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

[ fonte ]

8
Tormod Fjeldskår

A documentação no link w3

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

diz que estas são as formas recomendadas.

<test></test>
<test/>

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

Esquema XML: Estruturas introduz um mecanismo para sinalizar que um elemento deve ser aceito como · válido · quando não tem conteúdo apesar de um tipo de conteúdo que não requer ou até mesmo necessariamente permitir conteúdo vazio. Um elemento pode ser válido sem conteúdo se tiver o atributo xsi: nil com o valor true. Um elemento assim rotulado deve estar vazio , mas pode transportar atributos se permitido pelo tipo complexo correspondente.

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

Você usa xsi:nil quando sua semântica de esquema indica que um elemento tem um valor padrão e que o valor padrão deve ser usado se o elemento não estiver presente. Eu tenho que assumir que há pessoas inteligentes para quem a sentença anterior não é uma idéia auto-evidentemente terrível, mas soa como nove tipos ruins para mim. Todo formato XML com o qual já trabalhei representa valores nulos omitindo o elemento. (Ou atributo, e boa sorte marcando um atributo com xsi:nil.)

4
Robert Rossney

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

Se você precisar de informações mais sofisticadas, os esquemas GML adicionam o atributo nilReason, por exemplo: in GeoSciML :

  • xsi:nil com um valor de "true" é usado para indicar que nenhum valor está disponível
  • nilReason pode ser usado para registrar informações adicionais para valores ausentes; esse pode ser um dos motivos padrão do GML (missing, inapplicable, withheld, unknown), ou texto precedido por other:, ou pode ser um link do URI para uma explicação mais detalhada.

Quando você está trocando dados, a função para a qual o XML é comumente usado, os dados enviados para um destinatário ou para um determinado propósito podem ter um conteúdo obscurecido que estaria disponível para outra pessoa que pagou ou teve autenticação diferente. Saber o motivo pelo qual o conteúdo estava faltando pode ser muito importante.

Os cientistas também estão preocupados com a falta de informação. Por exemplo, se foi descartado por motivos de qualidade, eles podem querer ver os dados ruins originais.

4
Andy Dent

Em muitos casos, o objetivo de um valor Nulo é servir para um valor de dados que não estava presente em uma versão anterior de seu aplicativo.

Então diga que você tem um arquivo xml do seu aplicativo "ReportMaster" versão 1.

Agora, na versão 2 do ReportMaster, alguns outros atributos foram adicionados que podem ou não ser definidos.

Se você usar a representação 'no tag means null', terá compatibilidade reversa automática para a leitura do seu arquivo xml ReportMaster 1.

2
Jeroen Dirks