code

생성 된 XML에서 'standalone =“yes”'제거

codestyles 2020. 10. 13. 07:51
반응형

생성 된 XML에서 'standalone =“yes”'제거


결과 XML에서 standalone = "yes" 가 생성 되지 않도록하는 JAXB 설정을 알고 있습니까?

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

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

없는 데 사용할 수 있습니다

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

그러나 나는이 모범 사례를 고려하지 않을 것입니다.


JDK1.6의 일부인 JAXB에서

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

사용할 수 있습니다

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

또는

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.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" 속성 을 피합니다 .


다른 사람이 여전히이 문제로 어려움을 겪고 있다면

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

모든 XML 선언을 제거하고 String출력 스트림 / 메서드의 시작 부분에 직접 작성하십시오.


문서를 종속적으로 만들면 DOCTYPE(예 : 명명 된 엔터티 사용) 독립 실행이 중지되므로 standalone="yes"XML 선언에서 허용되지 않습니다.

그러나 독립형 XML은 어디에서나 사용할 수 있지만 비 독립형은 외부를로드하지 않는 XML 파서에 문제가 있습니다.

XML을 지원하지 않는 소프트웨어와의 상호 운용성 외에는이 선언이 어떻게 문제가 될 수 있는지 모르겠지만 끔찍한 정규식 수프가 있습니다.


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);  

나는 논평 할 "권한"을 가질만큼 충분히 높은 "평판"이 없다. ;-)

@Debasis, 지정한 속성은 다음과 같습니다.

"com.sun.xml.internal.bind.xmlHeaders"

해야한다:

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

"내부"속성을 사용하면 javax.xml.bind.PropertyException이 발생합니다.


단지 시도

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();
  }

참고 URL : https://stackoverflow.com/questions/277996/remove-standalone-yes-from-generated-xml

반응형