2010-08-03 3 views
1

intitial XML (BPEL) 파일을 감안할 때 : 나는 XML 내부에서 일부 데이터를 수정하기 위해 JAXB를 사용하는 함수를 작성했습니다JAXB 마샬링 문제 - 아마 관련 이름 공간에 대한 비교가되어

<?xml version="1.0" encoding="UTF-8"?> 
<process 
    name="TestSVG2" 
    xmlns="http://www.example.org" 
    targetNamespace="http://www.example.org" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <sequence> 
     <receive name="Receive1" createInstance="yes"/> 
     <assign name="Assign1"/> 
     <invoke name="Invoke1"/> 
     <assign name="Assign2"/> 
     <reply name="Reply1"/> 
    </sequence> 
</process> 

합니다.

public void editAction(String name, String newName) { 
    Process proc; 
    StringWriter sw = new StringWriter(); 
    JAXBContext jaxbContext = null; 
    Unmarshaller unMarsh = null; 
    Object obj = new Object(); 
    try { 
     /* XML TO JAVA OBJECT */ 
     jaxbContext = JAXBContext.newInstance("org.example"); 
     unMarsh = jaxbContext.createUnmarshaller(); 
     obj = unMarsh.unmarshal(new File(path + "/resources/" + BPELFilename)); 
     proc = (Process) obj; 
     Process.Sequence sequence = proc.getSequence(); 

     /* Determine which element needs to be edited */ 
     /* Do some editing , code wasn't included */ 

     /* OBJ Back to XML */ 
     Marshaller marsh = jaxbContext.createMarshaller(); 
     marsh.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
     //marsh.setProperty("com.sun.xml.bind.namespacePrefixMapper", new CustomPrefixMapper()); 
     marsh.marshal(obj, new File(path + "/resources/" + BPELFilename)); 

    } catch (JAXBException e) { 
     /* Be afraid */ 
     e.printStackTrace(); 
    } 
} 

JAXB 프로 관련 편집 후 결과 XML은 다음과 같습니다 : 다음과 같이 기능은 불행하게도

<!-- After --> 
<?xml version="1.0" encoding="UTF-8"?> 
<ns0:process 
    name="TestSVG2" 
    targetNamespace="http://www.example.org" 
    xmlns:ns0="http://www.example.org"> 

    <ns0:sequence> 
     <ns0:receive name="newName" createInstance="yes"/> 
     <ns0:assign name="Assign1"/> 
     <ns0:assign name="Assign2"/> 
     <ns0:invoke name="Invoke1"/> 
     <ns0:reply name="Reply1"/> 
    </ns0:sequence> 
</ns0:process> 

결과 XML, 우리의 XML 파서가 충돌하는 경우와 같이, 우리의 응용 프로그램에 호환되지 않는 새 XML을 구문 분석하고 있습니다.

그래서 :

  • 가 어떻게 결과 XML에 네임 스페이스 ns0를 제거하는 방법은 무엇입니까?
  • 초기 XML 파일 (xml:xsd이 누락되었습니다)에서 동일한 헤더를 유지하는 방법은 무엇입니까?

감사합니다.

도메인 오브젝트 : 당신이 MOXy JAXB 구현을 사용하는 경우

+0

합니다. JAXBContext는 스레드로부터 안전하기 때문에 이것을 한 번 생성 한 다음 해당 인스턴스를 다시 사용할 수 있습니다. –

+0

@Blise Doughan Blaise 감사합니다. 이 함수는 프로토 타입의 일부입니다. 우리는 다른 도서관을 평가하고 있으며, 우리는 JAXB에 왔습니다. 이것은 '진짜'프로젝트가 아닙니다. 그러나 나는 분명히 당신의 관찰을 고려할 것입니다. –

+0

JAXB가 가장 강력한 XML 바인딩 라이브러리라고 생각합니다. 저는 JAXB 전문가 그룹의 일원이며 MOXy JAXB 구현을 이끌고 있습니다. 언제든지 평가에 JAXB 질문이 있으면 여기에 질문을 게시하거나 [email protected]에 문의하십시오. –

답변

1

는 다음을 수행 할 수 있습니다

package example; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Process { 

} 

는 당신이 필요로하는 MOXY JAXB를 사용하려면 해당 패키지 주석 @XmlSchema

@javax.xml.bind.annotation.XmlSchema( 
    namespace = "http://www.example.org", 
    xmlns = { 
     @javax.xml.bind.annotation.XmlNs(prefix = "xsd", namespaceURI = "http://www.w3.org/2001/XMLSchema"), 
    }, 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package example; 

를 사용하여 다음 항목을 사용하여 jaxb.properties 파일을 모델 클래스에 추가하십시오.

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

이것은 XML 생성합니다 : 당신이 "editActition"각 호출에있다 JAXBContext의 인스턴스를 생성 난 그냥 코드에서 발견

<?xml version="1.0" encoding="UTF-8"?> 
<process xmlns="http://www.example.org" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/> 
관련 문제