2017-10-16 9 views
0

나는 정의 XSD 스키마를 사용하여 XML 마샬링 싶습니다 :JAXB에서 네임 스페이스로 XML을 마샬링하는 방법은 무엇입니까?

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="myNamespace" xmlns="myNamespace"> 
    <xs:element name="element" type="JavaBean" /> 
    <xs:complexType name="JavaBean"> 
    </xs:complexType> 
</xs:schema> 

이 비어 자바 빈 유형 : "에

package main; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "JavaBean") 
public class JavaBean { 
} 

간단한 테스트 결과 요소 '요소'의 선언을 찾을 수 없습니다. "오류가 발생했습니다.

package main; 

import java.io.File; 
import java.io.IOException; 

import javax.xml.XMLConstants; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 
import javax.xml.namespace.QName; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 

import org.xml.sax.SAXException; 

public class Test { 
    public static void main(String[] args) throws JAXBException, IOException, SAXException { 
     final SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     Schema schema = factory.newSchema(new File("sample.xsd")); 

     JavaBean message = new JavaBean(); 
     JAXBElement<JavaBean> element = new JAXBElement<>(new QName("element"), JavaBean.class, message); 

     JAXBContext context = JAXBContext.newInstance(JavaBean.class); 
     Marshaller jaxbMarshaller = context.createMarshaller(); 
     jaxbMarshaller.setSchema(schema); 
     jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     jaxbMarshaller.marshal(element, System.out); 
    } 
} 

재미있는 점은 XML 스키마 정의에서 targetNamespace 및 xmlns를 제거하면 잘 작동한다는 것입니다.

내가 뭘 잘못하고 있니?

+0

당신은 네임 스페이스 위치를 무시할 수 있습니다; – Yogi

+0

@ Yogi 나는 결과 XML에 그것을 포함하고 싶다. 무시하지 않는다. – Line

답변

1

스키마에 따르면이 요소는 기본적으로 myNamespace 네임 스페이스에 바인딩됩니다.

따라서 당신은 적절한 네임 스페이스 JavaBean을 만들어야합니다 jaxbMarshaller.setProperty (Marshaller.JAXB_SCHEMA_LOCATION, "")처럼 정렬 화하고있을 때

JAXBElement<JavaBean> element = new JAXBElement<>(new QName("myNamespace", "element"), JavaBean.class, message); 
+0

감사합니다. 그러나 마샬 러에게 기본 네임 스페이스의 요소를 검색하도록 알리는 것은 어떨까요? 그래서 프로그램은 그것에 대해 알 필요가 없습니다. – Line