Qual é a maneira correta de representar elementos XML nulos?

Eu vi elementos null representados de várias maneiras:

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

   Beowulf   

O elemento está presente, mas representado como um elemento vazio (o que acredito estar errado, já que ’empty’ e null são semanticamente diferentes):

   Beowulf     Beowulf   

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

   Beowulf  

O elemento tem um elemento filho (do TStamper abaixo):

   Beowulf   

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

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 de 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 pode significar que a série é um elemento inaplicável ao elemento atual).

De: O W3C

XML Schema: Structures 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 events) 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 events) que possui um modelo correspondente ao livro: série 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 fiquem vazios, você pode unir uma string enumerada que só permite “” e um decimal, ou usar um decimal que é nillable.

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 charts de object 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.

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

[ Fonte ]

A documentação no link w3

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

diz que estas são as formas recomendadas.

   

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

XML Schema: Structures 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.

Para esclarecer esta resposta: Conteúdo

     Blue    Content     

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 frase anterior não é uma idéia terrível, evidentemente, 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 .)

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: em GeoSciML :

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

Quando você está trocando dados, a function 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 o motivo da falta de informação. Por exemplo, se ele foi descartado por motivos de qualidade, eles podem querer ver os dados ruins originais.

Em muitos casos, o objective 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 retroativa automática para a leitura do seu arquivo xml ReportMaster 1.