XmlstreamWriter и Jaxb для поддерева без пространства имен

Я использую xmlstreamwriter и jaxb вместе, чтобы объединить большой xml-файл. я создаю поддерево с помощью jaxb, но проблема в том, что когда я маршал поддерево, к нему добавляется префикс пространства имен по умолчанию, как показано ниже:

<?xml version="1.0" encoding="UTF-8"?>
<MessageModel xmlns="urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19">
   <MessageHeader xmlns="" xmlns:ns2="urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19">
      <ns2:ProviderID>5922</ns2:ProviderID>
      <ns2:EffectiveDT>2016-08-08-04:00</ns2:EffectiveDT>
      <ns2:PartyCount>0</ns2:PartyCount>
      <ns2:ArrangementCount>1</ns2:ArrangementCount>
      <ns2:AppMetaDataString>ter</ns2:AppMetaDataString>
   </MessageHeader>
</MessageModel>

Я использую код ниже для маршалинга:

        StringWriter result = new StringWriter();
        MessageHeaderType messageHeaderType = createMessageHeader(objectFactory);
        JAXBElement<MessageHeaderType> element = new JAXBElement<MessageHeaderType>(new QName("MessageHeader"), MessageHeaderType.class, messageHeaderType);

        XMLStreamWriter  xmlOut = XMLOutputFactory.newFactory().createXMLStreamWriter(result);
        **//Setting default namespace** 
        xmlOut.setDefaultNamespace("urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19");
        xmlOut.writeStartDocument();
        xmlOut.writeStartElement("urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19", "MessageModel");
        xmlOut.writeNamespace("", "urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19");

        JAXBContext context = JAXBContext.newInstance(MessageHeaderType.class);
        Marshaller marshaller = context.createMarshaller();
        //marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
        marshaller.marshal(element, xmlOut);


        xmlOut.writeEndDocument();
        xmlOut.close();
        System.out.println(result.toString());

Я устанавливаю пространство имен по умолчанию, но оно все еще создает поддерево с пространством имен. Что я могу сделать, чтобы создать поддерево с Jaxb, но без пространства имен?

1 ответ

Решение

То, как вы использовали QName, неверно, у меня была похожая проблема, когда я впервые использовал его.

Когда вы просто указываете localName (один конструктор String), он предполагает, что пространство имен пустое. Вот почему MessageHeader имеет тег xmlns="", Подробнее об этом читайте здесь.

Конструктор, который вы должны использовать это.

Замените ваш текущий QName на этот, и он должен работать:

new QName("urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19", "MessageHeader");

Кроме того, вам не нужно

xmlOut.writeNamespace("", "urn:schemas.mycompany.com/ENT/MessageModel/2013/09/19");

Это то же самое, что и пространство имен по умолчанию.

Другие вопросы по тегам