Remove 'standalone = ‘yes’' do XML gerado
-
07-07-2019 - |
Pergunta
Você sabe de uma definição JAXB para evitar standalone = "yes" de ser gerado no XML resultante?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Solução
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);
pode ser usado para não ter nenhum
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
No entanto eu não tomaria considerar esta melhor prática.
Outras dicas
em JAXB que faz parte da JDK1.6
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
Você pode usar
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
ou
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE)
para desativar a declaração XML padrão, e em seguida, adicione a sua declaração XML personalizado,
<?xml version="1.0" encoding="UTF-8"?>
por
marshaller.setProperty("com.sun.xml.bind.xmlHeaders",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
para o XML gerado, evitando assim o standalone = "yes" propriedade.
apenas se alguém ainda está debatendo com esse problema, você pode considerar o uso
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
para remover todos a declaração XML e apenas escrever seu próprio String
no início do seu fluxo de saída / método
Se você fizer documento dependente DOCTYPE
(por exemplo, utilizar entidades chamado), então ele deixará de ser autônomo, assim standalone="yes"
não será permitido na declaração XML.
No entanto XML autônomo pode estar em qualquer lugar usado, enquanto não-autônomo é problemático para analisadores XML que não carregam externos.
Eu não vejo como essa declaração poderia ser um problema, excepto para a interoperabilidade com software que não suporta XML, mas um pouco de sopa regex horrível.
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
Isso funcionou para mim com JDK1.7. standalone = \ "não \" pode ser removido para obter apenas descansar da parte xml
Se você estiver usando apenas o pacote javax.xml padrão, você pode definir a opção JAXB_FRAGMENT do marshaller para 'true' (este omite a instrução de processamento XML padrão) e usar o método writeProcessingInstruction do XMLStreamWriter para introduzir seu próprio:
xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
jaxbMarshaller.setProperty( Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.marshal(object, xmlStreamWriter);
xmlStreamWriter.writeEndDocument();
Você pode usar: marshaller.setProperty ( "jaxb.fragment", Boolean.TRUE);
Ele funciona para mim em Java 8
No caso você está recebendo exceção propriedade, adicione a seguinte configuração:
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlDeclaration", Boolean.FALSE);
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
Eu não tenho um alto o suficiente "reputação" de ter o "privilégio" para comentários. ; -)
@Debasis, note que a propriedade que você especificou:
"com.sun.xml.internal.bind.xmlHeaders"
deve ser:
"com.sun.xml.bind.xmlHeaders" (without the "internal", which are not meant to be used by the public)
Se eu usar a propriedade "interno" como você fez, eu recebo um javax.xml.bind.PropertyException