O que é a maneira correta para representar elementos XML nulos?
Pergunta
Eu vi elementos null
representados de várias maneiras:
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. :)
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:
- 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
- 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
- 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 porother:
, 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.