2012-02-15 6 views
7

Marshaller.JAXB_FRAGMENT 속성을 사용하여 마샬링하는 데 문제가 있습니다. 다음은 출력하려는 ​​XML의 간단한 버전입니다.JAXB 단편 마샬링

<Import> 
    <WorkSets> 
     <WorkSet> 
      <Work> 
      <Work> 
      ... 
      .. 
      ... 
     </WorkSet> 
     <WorkSet> 
      <Work> 
      <Work> 
      ... 
     </WorkSet> 
    <WorkSets> 
<Import> 

<Import><WorkSets> 요소는 본질적 <WorkSet> & <Work> 많은 요소를 동봉 단지 용기 요소이다. 나는 현재 <WorkSet>에서 마샬을하려하고있다.

  1. 는 초기 <Import><WorkSets> 요소 마샬링 후 다음에서 원수에 <WorkSet> 소자에서 출력이 <Import><WorkSets> 태그로 묶여있을 수 있습니까?
  2. WorkSet 수준에서 마샬링 할 때 xmlns='http://namespace.com' 특성을 WorkSet 태그에 연결하면 네임 스페이스 특성이 Workset에 연결되지 않은 상태에서 마샬링하는 방법이 있습니까?
+0

잘 모르겠습니다. "및 요소"란 무엇입니까? WorkSet, WorkSet 및 Import 만 표시됩니다. "... 처음에 요소를 마샬링하고 그 다음에는 요소에서 마샬을 선언 할 때 ..."라고 할 때 당신은 무엇을 의미합니까? – AlexR

+0

@AlexR 내가 처음 질문을 올렸을 때 질문에 태그를 표시하지 못했지만 편집을 마쳤으므로 지금 표시해야합니다. 그렇지 않은 경우 알려주세요. – TyC

+0

이 게시물에서 답변을 수락 한 경우 질문을 [JAXB Fragment Marshal w/o namespace] (http://stackoverflow.com/questions/9297872)로 복제 한 이유가 무엇입니까? 적어도 그 질문이 포크로 찍힌다는 것을 언급하십시오 ... –

답변

17

기본적으로 컨테이너 객체로 전체 객체 트리를 구성하는 대신, JAXB를 사용하여 마샬링하도록 Workshop 인스턴스 모음을 스트리밍 할 수 있기를 원합니다.

XMLStreamWriter를 사용하고 WorkSet 객체를 JAXBElement로 래핑하여 마샬링하는 방법이 있습니다.

FileOutputStream fos = new FileOutputStream("foo.xml"); 
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(fos); 

writer.writeStartDocument(); 
writer.writeStartElement("Import"); 
writer.writeStartElement("WorkSets"); 

JAXBContext context = JAXBContext.newInstance(WorkSet.class); 
Marshaller m = context.createMarshaller(); 
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
for (WorkSet instance : instances) 
{ 
    JAXBElement<WorkSet> element = new JAXBElement<WorkSet>(QName.valueOf("WorkSet"), WorkSet.class, instance); 
    m.marshal(element, writer); 
} 

writer.writeEndDocument(); // this will close any open tags 
writer.close(); 

참고 : 위가 완전히 안된이며 뭔가를 엉망으로 할 수있다 그래서 여기에 거친 코드는 쓰기 트랙에 당신을 넣어해야 그의 손에서 샘플 코드 가까이 테스트하지 않습니다 랩핑 파트는 WorkSet의 각 인스턴스를 작성합니다. @XmlRootElement으로 주석을 추가하지 않기 때문에 WorkSet 인스턴스를 래핑해야하며 그렇지 않은 경우 JAXB는 객체를 마샬링하지 않습니다.

+0

Thanks @ JörnHorstmann, 조각 부분에 대해 잊어 버렸고 막 돌아오고있었습니다. – Ophidian

+1

감사! 방금 해봤는데 잘 작동하는 것 같습니다.두 번째 질문을 추가했습니다. WorkSet 인스턴스가 마샬링 될 때 xmlns 특성이 어떤 이유로 WorkSet 요소에 연결될 때 마샬링 될 때이 특성이 할당되지 않는 방법이 있습니까? – TyC

+0

그건, 전 완전히 확신 할 수 없습니다. JAXB javadocs를 통해 독서를 시작할 것입니다. 죄송합니다! – Ophidian

0

다른 방법은 들어오는 xml을 루트 요소를 만드는 데 필요한 요소로 래핑하는 것입니다. 그런 다음 루트 요소에 대한 Java 객체를 가져 와서 찾고있는 조각에 대한 getter를 호출합니다. 예를 들어

,이 같은 XML이 있다면 :

<XmlRootElement> 
    <FragmentElement> 
     <foo>This is the foo value</foo> 
     <bar>This is the bar value</bar> 
    </FragmentElement> 
</XmlRootElement> 

을 그리고 당신이 전해졌다 :

<FragmentElement> 
    <foo>This is the foo value</foo> 
    <bar>This is the bar value</bar> 
</FragmentElement> 

당신은 대한 XmlRootElement 태그 문자열을 포장 한 다음에 결과 문자열을 구문 분석 할 수를 루트 객체와 조각 객체를 가져옵니다. 예 :

public FragementElement getFragmentElement(String xml) { 
    xml = "<XmlRootElement>" + xml + "</XmlRootElement>"; 
    ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes()); 
    JAXBElement obj = (JAXBElement) unmarshaller.unmarshal(is); 
    XmlRootElement xmlRootElement = (XmlRootElement) obj.getValue(); 
    FragementElement fragmentElement = xmlRootElement.getText(); 
    return fragmentElement; 
} 
관련 문제