JAXB Фрагмент Marshal без пространства имен - PullRequest
11 голосов
/ 15 февраля 2012

Я использую свойство JAXB_FRAGMENT, чтобы мой маршаллер собирал данные на уровне WorkSet.Проблема в том, что когда я выполняю маршал, он каждый раз дает элементу WorkSet атрибут xmlns.Есть ли способ маршалировать, чтобы он не прикреплял атрибут xmlns?Вот как выглядит мой XML.

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

Вот код, который я использую для создания вышеуказанного:

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();

Ответы [ 3 ]

9 голосов
/ 16 февраля 2012

Если вы хотите, чтобы пространство имен по умолчанию для вашего документа было http://www.namespace.com, вы можете сделать следующее:

Демо

XMLStreamWriter.setDefaultNamespace(String) и XMLStreamWriter.writeNamespace(String, String) методы будут использоваться для установки и записи пространства имен по умолчанию для документа 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

Я предполагаю, что вы указали информацию о пространстве имен в своемМодель JAXB.

package forum9297872;

import javax.xml.bind.annotation.XmlRootElement;

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

}

Выход

Ниже приведен результат запуска демонстрационного кода:

<?xml version="1.0" ?><Import xmlns="http://www.namespace.com"><WorkSets><WorkSet></WorkSet><WorkSet></WorkSet></WorkSets></Import>
1 голос
/ 16 февраля 2012

Для этого есть три обходных пути.

1) Создайте аннотированные объекты JAXB для контейнера ваших рабочих наборов.Добавьте рабочие наборы к этому объекту и затем выполните маршализацию всего этого.

2) Следуйте первому примеру в 101 способе маршалинга объектов с помощью JAXB и используйте DocumentBuilderFactory с учетом пространства имен.

3) Предполагая, что объект jaxb находится в пакете, который никогда не должен иметь подходящих пространств имен, вы можете добавить следующее к аннотации пакета: (примечание: прошло уже некоторое время с тех пор, как я это сделал, и я не тестировалэтот код)

@XmlSchema(namespace = "", elementFormDefault = XmlNsForm.UNQUALIFIED) 
package example;
0 голосов
/ 12 февраля 2016

Просто еще один пример:

    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;
    }
...