Pergunta

Escrevi uma ferramenta simples para gerar um conjunto de dados DBUnit XML usando consultas inseridas pelo usuário.Quero incluir cada consulta inserida no XML como um comentário, mas a API DBUnit para gerar o arquivo XML não suporta inserir o comentário onde eu gostaria (acima dos dados que ele gera), então estou recorrendo a colocar o comente com TODAS as consultas na parte superior ou inferior.

Então minha pergunta:é XML válido para colocá-lo em qualquer local?Por exemplo, acima da Declaração XML:

<!-- Queries used: ... -->
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  ...
</dataset>

Ou abaixo do nó raiz:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  ...
</dataset>
<!-- Queries used: ... -->

Pretendo tentar inicialmente acima da Declaração XML, mas tenho dúvidas se esse XML é válido, apesar da afirmação de Wikipédia:

Os comentários podem ser colocados em qualquer lugar da árvore, inclusive no texto se o conteúdo do elemento for texto ou #PCDATA.

Pretendo postar de volta se isso funcionar, mas seria bom saber se é um padrão XML oficial.

ATUALIZAR: Ver minha resposta abaixo para o resultado do meu teste.

Foi útil?

Solução

De acordo com Especificação XML, um documento XML bem formado é:

document ::= prolog element Misc*

onde prolog é

prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?

e Misc é

Misc ::= Comment | PI | S

e

XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'

o que significa que, se você quiser ter comentários no topo, não poderá ter uma declaração de tipo XML.

Você pode, no entanto, ter comentários após a declaração e fora do elemento do documento, na parte superior ou inferior do documento, porque Misc* pode conter comentários.

A especificação concorda com a Wikipedia nos comentários:

2.5 Comentários

[Definição:Os comentários podem aparecer em qualquer lugar de um documento, fora de outras marcações;além disso, podem aparecer na declaração do tipo de documento em locais permitidos pela gramática.Eles não fazem parte dos dados de caracteres do documento;um processador XML PODE, mas não precisa, possibilitar que um aplicativo recupere o texto dos comentários.Para compatibilidade, a string "--" (hífen duplo) NÃO DEVE ocorrer nos comentários.] As referências de entidade de parâmetro NÃO DEVEM ser reconhecidas nos comentários.

Tudo isso junto significa que você pode colocar comentários em qualquer lugar que não esteja dentro de outra marcação, exceto que você não pode ter uma declaração XML se você começar com um comentário.

No entanto, embora na teoria a teoria concorde com a prática, na prática isso não acontece, então eu ficaria curioso para ver como seu experimento funciona.

Outras dicas

O primeiro exemplo não é XML válido, a declaração deve ser a primeira coisa em um documento XML.

Mas, além disso, os comentários podem ir para qualquer outro lugar.

Corrigindo seu primeiro exemplo:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Queries used: ... -->
<dataset>
</dataset>

A instrução de processamento deve ser a primeira coisa no conteúdo XML (veja Comentário XML e instruções de processamento).O seguinte deve funcionar:

<?xml version='1.0' encoding='UTF-8'?>
<!-- Queries used: ... -->
<dataset>
  ...
</dataset>

Obrigado pelas respostas a todos!

Acontece que o comentário antes do arquivo pareceu funcionar, mas quando mergulhei na fonte do DBUnit, é porque a validação está desativada.

Eu tentei carregar um documento simples por meio de:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("/path/to/file"));

e isso falha com uma exceção porque a Declaração XML não é a primeira coisa (como outros indicaram seria o caso).

Então, embora o DBUnit funcione, eu prefiro ter um XML válido, então movi o comentário para o final (como o DBUnit gera a Declaração XML, não é uma opção colocar o comentário abaixo dele, mesmo que eu prefira isso. .pelo menos não sem modificar o XML após o fato, o que daria mais trabalho do que valeria).

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