удалить атрибут xmlns из корневого элемента при маршалинге jaxb

Это может быть связано с JAXB Marshaller - Как подавить xmlns атрибуты пространства имен?

Но моя проблема немного в другом. Я выполняю обычную сортировку java, и мой xsd не имеет пространств имен. Сгенерированный xml также не имеет пространств имен, за исключением корневого элемента.

<?xml version="1.0" encoding="UTF-8"?><rootElement xmlns:ns2="unwanted namespace">

unwanted namespace взят из другой схемы того же проекта, и я не уверен, почему это происходит на данном этапе.

Мой rootElement.java, созданный jaxb2-maven-plugin, выглядит так:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"feed"
})
@XmlRootElement(name = "rootElement", namespace = "")
public class RootElement{
....
}

На данный момент все, что я хочу, - это избавиться от атрибута xmlns:ns2="unwanted namespace" из сгенерированного xml, и я борюсь с этим.

Я посмотрел на свой package-info.java, и он выглядит так:

@javax.xml.bind.annotation.XmlSchema(namespace = "unwanted namespace", elementFormDefault =   javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.mypackage;

Я пробовал добавить его -npa, но он по какой-то причине не работает на jaxb2-maven-plugin. Я пробовал NamespaceMapper, но он работает для изменения префиксов. Я не мог заставить его полностью удалить пространство имен. Меня это беспокоит уже день.


person icedek    schedule 03.04.2013    source источник


Ответы (1)


У меня сейчас похожие требования. Единственное решение, которое сработало для меня, - это реализация оболочки для XMLStreamWriter.

Пожалуйста, прочтите мой ответ здесь. Я также описал там другие опробованные мной решения.

Сериализация с использованием кода из приведенной выше ссылки выглядит так:

XMLOutputFactory factory = XMLOutputFactory.newFactory();

StringWriter writer = new StringWriter(XML_BUFFER_INITIAL_SIZE);
XMLStreamWriter xmlWriter = null;

try {
  xmlWriter = factory.createXMLStreamWriter(writer);
  JAXBContext context = JAXBContext.newInstance(MyJAXBGeneratedClass.class);
  Marshaller marshaller = context.createMarshaller();
  marshaller.marshal(reportContainer, new NamespaceStrippingXMLStreamWriter(xmlWriter));
  xmlWriter.flush();
}
finally {
  if (xmlWriter != null)
    xmlWriter.close();
}

return writer.toString();
person sergio    schedule 29.06.2016