2012-02-15 17 views
10

Używam właściwości JAXB_FRAGMENT, aby mój marshaller mógł przeprowadzić operację na poziomie WorkSet. Problem polega na tym, że podczas marszu daje to każdemu elementowi WorkSet atrybut xmlns. Czy istnieje sposób kontrolowania, aby nie dołączyć atrybutu xmlns? Oto jak wygląda mój XML.Fragment JAXB Fragment Marszałka bez przestrzeni nazw

<Import> 
     <WorkSets> 
      <WorkSet xmlns="http://www.namespace.com"> 
       <Work> 
       <Work> 
       ... 
       .. 
       ... 
      </WorkSet> 
      <WorkSet xmlns="http://www.namespace.com"> 
       <Work> 
       <Work> 
       ... 
      </WorkSet> 
     </WorkSets> 
    </Import> 

Oto kod Używam tworzyć wyżej:

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

JAXBContext jc = JAXBContext.newInstance(WorkSet.class); 
Marshaller m = jc.createMarshaler(); 
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 

writer.writeStartDocument(); 
writer.writeStartElement("Import"); 
writer.writeAttribute("xmlns","http://www.namespace.com"); 
writer.writeStartElement("WorkSets"); 

while(hasWorkSet){ 
m.marshal(workSet, writer) 
} 
writer.writeEndDocument(); 
writer.close(); 
+0

Chcesz mieć deklarację przestrzeni nazw wyżej w dokumencie, czy nie chcesz w ogóle zadeklarować przestrzeni nazw? –

+0

@BlaiseDoughan Piszę znaczniki Import i WorkSets ręcznie przez XMLStreamWriter, więc ustawiam również ich atrybuty ręcznie. Używam JAXB do gromadzenia kolekcji instancji WorkSet, która działa dobrze, po prostu nie chcę, aby atrybut xmlns był dołączony do każdego z nich. Nie wstawił on atrybutów xmlns do WorkSet, gdy użyłem JAXB do zebrania razem całej instancji XML (Import, Worksets, WorkSet, Work ..). Zaczęło się dopiero, gdy przełączałem JAXB_FRAGMENT na marszałek tylko WorkSet. – TyC

+0

@BlaiseDoughan Przeglądałem interfejs API JAXB i nadal nie widzę, co powoduje umieszczenie przestrzeni nazw w elemencie WorkSet. – TyC

Odpowiedz

8

Zakładając chcesz domyślnej przestrzeni nazw dla dokumentu być http://www.namespace.com, można wykonać następujące czynności:

Demo

XMLStreamWriter.setDefaultNamespace(String) i XMLStreamWriter.writeNamespace(String, String) zostaną użyte metody do ustawiania i zapisywania domyślnego obszaru nazw dla dokumentu XML.

package forum9297872; 

import javax.xml.bind.*; 
import javax.xml.stream.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(System.out); 
     writer.setDefaultNamespace("http://www.namespace.com"); 

     JAXBContext jc = JAXBContext.newInstance(WorkSet.class); 
     Marshaller m = jc.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 

     writer.writeStartDocument(); 
     writer.writeStartElement("http://www.namespace.com", "Import"); 
     writer.writeNamespace("", "http://www.namespace.com"); 
     writer.writeStartElement("WorkSets"); 

     m.marshal(new WorkSet(), writer); 
     m.marshal(new WorkSet(), writer); 

     writer.writeEndDocument(); 
     writer.close(); 
    } 

} 

WorkSet

Moje założenie jest, że określone informacje namespace w modelu JAXB.

package forum9297872; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="WorkSet", namespace="http://www.namespace.com") 
public class WorkSet { 

} 

Wyjście

Poniżej jest wyjście z uruchomieniem kodu Demo:

<?xml version="1.0" ?><Import xmlns="http://www.namespace.com"><WorkSets><WorkSet></WorkSet><WorkSet></WorkSet></WorkSets></Import> 
+0

To działało, ale nie mam pojęcia, dlaczego. Nie określono nazwy w klasie WorkSet. Oto znacznik XmlRootElement dołączony do klasy. @XmlRootElement (name = "WorkSet"). – TyC

+0

Czy istnieje klasa 'informacje o pakiecie' w tym samym pakiecie co klasa' WorkSet'? –

+0

Tak. Zawiera następujące elementy: @ javax.xml.bind.annotation.XmlSchema (namespace = "http://www.itron.com/nVanta", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED). – TyC

1

Istnieją trzy sposoby obejścia tego.

1) Utwórz obiekty adnotowane JAXB dla kontenera swoich zestawów roboczych. Dodaj zestawy robocze do tego obiektu, a następnie zmontuj całość.

2) Postępuj zgodnie z pierwszym przykładem w 101 ways to marshal objects with JAXB i użyj DocumentBuilderFactory z świadomością przestrzeni nazw.

3) Zakładając, że obiekt jaxb znajduje się w pakiecie, który nigdy nie powinien mieć kwalifikowanych obszarów nazw, można dodać następujące elementy do adnotacji pakietu: (uwaga: minęło trochę czasu, odkąd to zrobiłem i nie przeszedłem testu ten kod)

@XmlSchema(namespace = "", elementFormDefault = XmlNsForm.UNQUALIFIED) 
package example; 
0

Jeszcze jeden przykład:

try { 
     JAXBContext customerInformationRequestContext = JAXBContext.newInstance(CustomerInformationRequest.class); 
     Unmarshaller unmarshaller = customerInformationRequestContext.createUnmarshaller(); 
     StringReader stringReader = new StringReader(requestPayload); 
     XMLInputFactory xif = XMLInputFactory.newFactory(); 
     XMLStreamReader xsr = xif.createXMLStreamReader(stringReader); 
     XMLStreamReaderWrapper reader = new XMLStreamReaderWrapper(xsr); 
     CustomerInformationRequest customerInformationRequest = (CustomerInformationRequest) unmarshaller.unmarshal(reader); 
     CustomerInformationResponse customerInformationResponse = customerLookup(customerInformationRequest, sessionTransaction); 
     JAXBContext customerInformationResponseContext = JAXBContext.newInstance(CustomerInformationResponse.class); 
     Marshaller marshaller = customerInformationResponseContext.createMarshaller(); 
     StringWriter stringWriter = new StringWriter(); 
     XMLOutputFactory xof = XMLOutputFactory.newFactory(); 
     XMLStreamWriter xsw = xof.createXMLStreamWriter(stringWriter); 
     xsw = new XMLStreamWriterWrapper(xsw); 
     marshaller.marshal(customerInformationResponse, xsw); 
     String responsePayload = stringWriter.toString(); 
     return responsePayload; 
    } catch (Exception e) { 
     log.debug("The payload could not be unmarshalled.", e); 
     return null; 
    } 
Powiązane problemy