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"?>
Foi útil?

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

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