it-swarm.dev

Remover 'standalone = "yes"' do XML gerado

Você sabe de uma configuração de JAXB para impedir que standalone = "yes" seja gerado no XML resultante?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
75
Johan Pelgrim
marshaller.setProperty("com.Sun.xml.bind.xmlDeclaration", Boolean.FALSE);

pode ser usado para não ter

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

No entanto, eu não consideraria esta melhor prática.

56
Sam

em JAXB que faz parte do JDK1.6

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
115
so_mv

Você pode usar

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

ou

marshaller.setProperty("com.Sun.xml.bind.xmlDeclaration", Boolean.FALSE)

para desabilitar a declaração XML padrão e, em seguida, adicionar sua declaração XML personalizada,

<?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 a propriedade standalone = "yes" .

55
WarFox

apenas se alguém ainda está lutando com este problema, você pode considerar o uso

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

para remover toda a declaração XML e apenas escrever sua própria String no início de seu fluxo de saída/método

6
benez

Se você tornar o documento dependente de DOCTYPE (por exemplo, usar entidades nomeadas), ele deixará de ser autônomo, portanto, standalone="yes" não será permitido na declaração XML.

No entanto, o XML independente pode ser usado em qualquer lugar, enquanto o não autônomo é problemático para analisadores XML que não carregam elementos externos. 

Não vejo como essa declaração possa ser um problema, a não ser pela interoperabilidade com software que não suporta XML, mas por alguma sopa horrível de regex.

4
Kornel
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 o JDK1.7. standalone =\"no \" pode ser removido para obter apenas o restante da parte xml

3
Debasis Das

Se você estiver usando apenas o pacote javax.xml padrão, poderá definir a opção JAXB_FRAGMENT do marshaller como 'true' (isso omite a instrução de processamento xml padrão) e usar o método writeProcessingInstruction do XMLStreamWriter para inserir o 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();
2
eddo

Você pode usar: Marshaller.setProperty ("jaxb.fragment", Boolean.TRUE);

Isso funciona para mim no Java 8

2
William Funchal Pereira

Eu não tenho uma "reputação" alta o suficiente para ter o "privilégio" de comentar. ;-)

@Debasis, observe que a propriedade que você especificou:

"com.Sun.xml.internal.bind.xmlHeaders"

deveria estar:

"com.Sun.xml.bind.xmlHeaders" (without the "internal", which are not meant to be used by the public)

Se eu usar a propriedade "interna" como você fez, eu recebo um javax.xml.bind.PropertyException

0
Ari

Caso você esteja recebendo uma exceção de 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);  
0
Alisha Setia