결과 XML에서 standalone = "yes" 가 생성되는 것을 방지하는 JAXB 설정을 알고 있습니까?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
답변:
이 속성 :
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
... 다음이없는 데 사용할 수 있습니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
그러나 나는이 모범 사례를 고려하지 않을 것입니다.
JDK1.6의 일부인 JAXB에서
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
standalone
XML 선언에서 속성을 제거하는 것입니다.
사용할 수 있습니다
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
또는
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false)
기본 XML 선언을 비활성화 한 다음 사용자 지정 XML 선언을 추가하려면
<?xml version="1.0" encoding="UTF-8"?>
으로
marshaller.setProperty("com.sun.xml.bind.xmlHeaders",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
생성 된 xml에 추가하여 standalone = "yes" 속성 을 피합니다 .
문서를 종속적으로 만들면 DOCTYPE
(예 : 명명 된 엔터티 사용) 독립 실행이 중지되므로 standalone="yes"
XML 선언에서 허용되지 않습니다.
그러나 독립형 XML은 어디에서나 사용할 수 있지만 비 독립형은 외부를로드하지 않는 XML 파서에 문제가 있습니다.
XML을 지원하지 않는 소프트웨어와의 상호 운용성 외에는이 선언이 어떻게 문제가 될 수 있는지 모르겠지만 끔찍한 정규식 수프가 있습니다.
DOCTYPE
만드는가?
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
이것은 JDK1.7에서 나를 위해 일했습니다. standalone = \ "no \"를 제거하여 나머지 xml 부분 만 가져올 수 있습니다.
기본 javax.xml 패키지 만 사용하는 경우 마샬 러의 JAXB_FRAGMENT 옵션을 'true'(기본 xml 처리 명령 생략)로 설정하고 XMLStreamWriter의 writeProcessingInstruction 메서드를 사용하여 직접 삽입 할 수 있습니다.
xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
jaxbMarshaller.setProperty( Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.marshal(object, xmlStreamWriter);
xmlStreamWriter.writeEndDocument();
다음을 사용할 수 있습니다. marshaller.setProperty ( "jaxb.fragment", Boolean.TRUE);
Java 8에서 나를 위해 작동합니다.
속성 예외가 발생하는 경우 다음 구성을 추가하십시오.
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);
Java 1.8 및 JAXB 2.3.1을 사용하고 있습니다.
먼저 pom.xml에서 java 1.8을 사용해야합니다.
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
그런 다음 소스 코드에서 사용했습니다. (키는 내부 부분이었습니다)
// remove standalone=yes
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
단지 시도
private String marshaling2(Object object) throws JAXBException, XMLStreamException {
JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
StringWriter writer = new StringWriter();
writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
jaxbMarshaller.marshal(object, writer);
return writer.toString();
}
당신이 가지고 있다면 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
그러나 이것을 원하십시오 : <?xml version="1.0" encoding="UTF-8"?>
그냥 해:
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");