2010-06-18 5 views
1

간단한 작업 : 요소 두 속성을 쓰기 :네임 스페이스를 수리 XMLOutputStream, 그리고 네임 스페이스없이 속성

String nsURI = "http://example.com/"; 
XMLOutputFactory outF = XMLOutputFactory.newFactory(); 
outF.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true); 
XMLStreamWriter out = outF.createXMLStreamWriter(System.out); 
out.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, "element", nsURI); 
out.writeAttribute("attribute", "value"); 
out.writeAttribute("attribute2", "value"); 
out.writeEndElement(); 
out.close(); 

Woodstox의 대답 :

<element xmlns="http://example.com/" attribute="value" attribute2="value"></element> 

JDK 6 답 :

<zdef-1905523464:element xmlns="" xmlns:zdef-1905523464="http://example.com/" attribute="value" attribute2="value"></zdef-1905523464:element> 

뭐?! 우리는 요소에 접두사를 추가하는 경우

또한, :

out.writeStartElement("ns", "element", nsURI); 

JDK 6 더 이상 = ""XMLNS을 방출하는 시도합니다 :

<ns:element xmlns:ns="http://example.com/" attribute="value" attribute2="value"></ns:element> 

을 그리고 우리는 (즉, 단지 속성을 떨어 뜨리면 하나있어) 괜찮아.

저는 이것이 JDK 6의 버그라고 확신합니다. 맞습니까? 그리고 누구든지 두 라이브러리 (및 다른 모든 것들)를 행복하게 유지할 수있는 해결 방법을 제안 할 수 있습니까? 내가 그것을 도울 수 있으면 나는 woodstox를 요구하고 싶지 않다.

답변

2

나는 요소를 추가 할 때 기본 네임 스페이스 무엇인지 XMLStreamWriter에게 다음을 사용해야합니다 생각 :

String nsURI = "http://example.com/"; 
XMLOutputFactory outF = XMLOutputFactory.newFactory(); 
outF.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true); 
XMLStreamWriter out = outF.createXMLStreamWriter(System.out); 
out.setDefaultNamespace(nsURI); 
out.writeStartElement(nsURI, "element"); 
out.writeAttribute("attribute", "value"); 
out.writeAttribute("attribute2", "value"); 
out.writeEndElement(); 
out.close(); 

위의 코드는 나에게이 출력 제공 :

<element xmlns="http://example.com/" 
    attribute="value" attribute2="value"></element> 

자바 버전을 "1.6.0_20"

+0

이전에 손상된 출력을 얻었습니까? 1.6.0_18에서이 문제가 해결되지 않습니다. – user205512

+0

또는 방금 다운로드 한 1.6.0_20. – user205512

+0

예, 원래 코드 – MarcoS

1

필자가 제안한 것은 writeAttribute()의 2 인자 버전에 의존하지 말아야한다는 것입니다. 정확하게 출력해야하는 내용이 명확하지 않기 때문입니다. sh ould는 네임 스페이스 ("네임 스페이스 없음") 또는 현재 기본 네임 스페이스를 사용합니까? 이는 XML 사양에 따라 속성이 기본 네임 스페이스 (명시 적 속성 만 사용)를 절대로 사용하지 않기 때문에 특히 혼란 스럽습니다. 틀림없이 표현 된 모든 행동은 잠재적으로 정확하다고 볼 수 있습니다. 그러나 분명히 그들 모두가 될 수는 없습니다. 그것은 단지 Stax API가 실제 대답이 무엇인지 (AFAIK) 제대로 정의하지 못합니다.

그래서 : 속성이 사용해야하는 (""또는 "null 네임 스페이스 없음"에 대해 null이 작동 됨) 네임 스페이스를 지정하면 모든 것이 잘 작동합니다.

JDK 버전의 문제점은 내가 아는 한 일부 버전에서는 실제로 속성이 기본 네임 스페이스를 사용한다고 가정하기 때문에, 그래서 그 가짜 'xmlns = ""'가 추가되었습니다. 불필요합니다.

관련 문제