2013-02-13 2 views
1

를 사용하여 하나의 클래스에 비 정렬 :내가 마샬링을 사용하여 다음과 같은 XML을 생성 않는 <strong>회사</strong> 클래스를 만들었다는 EclipseLink

<?xml version="1.0" encoding="UTF-8"?> 
<ns2:company xmlns:ns2="http://www.example.com/"> 
    <ns2:employee> 
     <job>sogi</job> 
     <name>togi</name> 
     <age>22</age> 
    </ns2:employee> 
</ns2:company> 

참고 : 나는 @XmlPath을 사용 ("직원/작업/텍스트()") 태그는 회사 클래스로 필수 경로를 가져옵니다.

하지만 내가 동일한 회사 클래스를 사용하여 언 마샬링 할 때 올바른 값을 가져 오지 않습니다. 대신에 null 값을 얻습니다.

답변

1

@XmlPath 주석에 네임 스페이스 정보를 포함해야합니다. 당신의 XML 문서는 네임 스페이스의 자격을 가지고 있기 때문에

패키지 정보

, 당신은 공간 정보를 지정 패키지 레벨 @XmlSchema 주석을 활용해야합니다. 네임 스페이스에있는 XmlPath의 조각에 대한 @XmlPath 매핑에서 회사

@XmlSchema(
    namespace="http://www.example.com/", 
    xmlns={ 
     @XmlNs(namespaceURI = "http://www.example.com/", prefix = "foo") 
    } 
) 
package forum14848450; 

import javax.xml.bind.annotation.*; 

은 당신이 @XmlSchema 주석에 정의 된 접두사를 활용해야하는 자격.

package forum14848450; 

import javax.xml.bind.annotation.XmlRootElement; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement 
public class Company { 

    @XmlPath("foo:employee/job/text()") 
    private String employeeJob; 

    @XmlPath("foo:employee/name/text()") 
    private String employeeName; 

    @XmlPath("foo:employee/age/text()") 
    private int employeeAge; 

} 

jaxb.properties

는 (: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html 참조) 다음 항목을 사용하여 도메인 모델과 동일한 패키지에 jaxb.properties라는 파일을 포함 할 필요가 당신의 JAXB 공급자로 MOXY을 지정합니다.

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

데모

데모 코드는 아래 질문에서 문서를 비 정렬 화되고, 다시 XML로 마샬링.

package forum14848450; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Company.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum14848450/input.xml"); 
     Company company = (Company) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(company, System.out); 
    } 

} 

출력 아래

데모 코드를 실행 한 출력됩니다. 출력 문서가 @XmlPath 주석에 정의 된 접두사를 사용하는 방법에 유의하십시오. 추가 정보

<?xml version="1.0" encoding="UTF-8"?> 
<foo:company xmlns:foo="http://www.example.com/"> 
    <foo:employee> 
     <job>sogi</job> 
     <name>togi</name> 
     <age>22</age> 
    </foo:employee> 
</foo:company>