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


82

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

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

7
그게 왜 문제입니까?
Kornel

독립이 = 인식되지 않는 예 있기 때문에 코나의 WebMethod에 익숙해 나의 프로젝트 @Kornel은 그 오류를 생성합니다
aswzen

답변:


62

이 속성 :

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

... 다음이없는 데 사용할 수 있습니다.

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

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


2
고마워요, 이것이 바로 제가 필요한 것입니다. 나는 라인을 포함하는 것이 가장 좋은 방법이라는 데 동의하지만, 내가 인터페이스하고있는 웹 서비스는 그것을 기대하지 않습니다.
jgrowl

6
잘 작동하지만 FWIW, 합법적 인 xml을 수용 할 수 없으면 서비스가 중단되므로 버그 보고서를 제출하는 것이 좋습니다.
StaxMan 2011 년

4
JDK1.6의 JAXB에서는 작동하지 않습니다. 올바른 솔루션은 so_mv의 답변을 참조하십시오.
sversch

1
비행 중에 폭발 : 예외.
Nicolas Barbulesco 2013

1
@sversch : 속성 클래스 : "com.sun.xml.internal.bind.xmlHeaders"
baybora.oren

120

JDK1.6의 일부인 JAXB에서

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

13
이것은 예상 된 결과를 제공하지 않습니다. 이렇게하면 모든 XML 선언 줄이 제거됩니다. 내가 원하는 것은 standaloneXML 선언에서 속성을 제거하는 것입니다.
Nicolas Barbulesco 2013

내가 한 것처럼 이것이 왜 작동하지 않는지 궁금하다면 그 효과는 사용중인 마샬 API에 따라 달라진다는 것입니다. marshal (Object, Outputstream) 및 marshal (Object, Writer)의 경우 여기에 제안 된대로 작동합니다. marshal (Object, Node)의 경우 효과가 없습니다. 나머지 마샬 API 의미 에 대해서는 지원되는 속성 섹션에서 여기 를 참조하십시오.
Lasse Samson

59

사용할 수 있습니다

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" 속성 을 피합니다 .


2
"xmlDeclaration"이있는 "setProperty"는 비행 중에 폭발합니다 : 예외.
Nicolas Barbulesco 2013

2
"xmlHeaders"가있는 "setProperty"줄도 실패합니다. PropertyException. 그래서 이것은 해결책이 아닙니다.
Nicolas Barbulesco 2013

어떤 버전의 Java 및 jaxb를 사용하고 있습니까?
WarFox 2013

xmlHeaders 명령 @WarFox 지정해 setProperty는 jdk1.6.0_24과 JAXB 버전 2.1하지 작업을 수행
브라이언 라슨

3
java6 또는 java7에 관계없이 'internal'을 추가해야했습니다. 즉 marshaller.setProperty ( "com.sun.xml.internal.bind.xmlHeaders", "<? xml version = \"1.0 \ "encoding = \"UTF-8) \ "?>");
Caoilte 2014-08-23

7

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

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

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


5

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

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

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


1
정확히, xml 선언에 대해 barfs하는 xml 처리 시스템은 의심스러워 보입니다.
StaxMan 2011 년

1
질문에 어떤 방식으로 대답합니까?
ᄂ ᄀ

문서가 어떻게 의존하게 DOCTYPE만드는가?
Lii

3
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 부분 만 가져올 수 있습니다.


1
오류 : javax.xml.bind.PropertyException : 이름 : com.sun.xml.internal.bind.xmlHeaders 값 : <? xml version = "1.0"encoding = "UTF-8"?>
aswzen

3

기본 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();


1

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

@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이 발생합니다.


1

속성 예외가 발생하는 경우 다음 구성을 추가하십시오.

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

1

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

0

단지 시도

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

0

당신이 가지고 있다면 <?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\"?>");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.