programing

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

powerit 2023. 9. 20. 20:47
반응형

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

결과 XML에서 독립 실행형="yes"가 생성되지 않도록 하는 JAXB 설정을 알고 계십니까?

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

JDK1.6의 일부인 JAXB에서

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

이 속성:

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

...no가 없을 때 사용할 수 있습니다.

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

하지만 저는 이 최선의 방법이라고 생각하지 않습니다.

사용하실 수 있습니다.

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로 이동하므로 독립 실행형="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_를 설정할 수 있습니다.마샬러의 FRAMGATION 옵션을 'true'(기본 xml 처리 명령이 생략됨)로 설정하고 XML StreamWriter의 writeProcessingInstrument 메서드를 사용하여 다음과 같이 입력합니다.

xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
jaxbMarshaller.setProperty( Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.marshal(object, xmlStreamWriter);
xmlStreamWriter.writeEndDocument();

해보기만 하면 됩니다

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

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\"?>");

마샬러.setProperty("jaxb.fragment"), Boolean 등을 사용할 수 있습니다.TRUE);

자바 8에서도 잘 통합니다.

저는 댓글을 달 수 있는 "특권"을 가질 만큼 "평판"이 높지 않습니다. ;-)

@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를 얻을 수 있습니다.속성 예외

속성 예외가 발생하는 경우 다음 구성을 추가합니다.

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

있다면<?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\"?>");

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

반응형