Jaxb генерирует xml - проблема с префиксом корневого элемента - PullRequest
9 голосов
/ 30 ноября 2010

Я пытаюсь сгенерировать xml, используя jaxb. Я создал xsd и сгенерировал классы Java. Но когда я генерирую xml, я получаю префикс ns2 к корневому тегу, который мне не нужен.

Пример: я хочу, чтобы корневой тег был

 <report>
   <id>rep 1</id>
</report>

, но получаю как

<ns2:report>
....
</ns2:report>

В сгенерированном классе Java я дал аннотацию как @XmlRootElement(name="report",namespace="urn:report")

Может кто-нибудь, пожалуйста, помогите

Ответы [ 5 ]

12 голосов
/ 30 ноября 2010

Если это ваш класс:

package example;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="report",namespace="urn:report")
public class Root {

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}

Тогда имеет смысл, что в корневом элементе есть префикс, потому что вы указали, что корневому элементу соответствует пространство имен, а элементу id - нет.

<ns2:report xmlns:ns2="urn:report">
    <id>123</id>
</ns2:report>

Если вы добавите в свою модель класс информации о пакете, вы можете переместить аннотацию @XmlSchema:

@XmlSchema(
        namespace = "urn:report",
        elementFormDefault = XmlNsForm.QUALIFIED)
package example;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

Тогда реализация JAXB может выбрать использование пространства имен по умолчанию, но учтите, что теперь все элементы имеют квалификацию пространства имен, которая может соответствовать или не соответствовать вашей XML-схеме:

<report xmlns="urn:report">
    <id>123</id>
</report>

Для получения дополнительной информации о JAXB и пространствах имен см .:

1 голос
/ 30 ноября 2010

Взгляните на этот ответ . В нем описано, как использовать SAX-фильтр для удаления любого пространства имен.

1 голос
/ 30 ноября 2010

Запись в блоге Настройка JAXB показывает альтернативы, предоставляемые реализацией PreferredMapper.К сожалению, это объясняет, что невозможно полностью подавить пространства имен.

0 голосов
/ 31 марта 2017

Как-то принятый ответ у меня не сработал. Я добился успеха, когда нашел решения в некоторых связанных вопросах о переполнении, включая DelegatingXMLStreamWriter из cxf и фильтр NoNamesWriter . Реализация, которую я использовал с NoNamesWriter:

public class NoNamesWriter extends DelegatingXMLStreamWriter 
{
    @Override
    public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
        delegate.writeStartElement("", local, uri);
    }   

    public static XMLStreamWriter filter(FileOutputStream fileOutputStream) throws XMLStreamException {
        return new NoNamesWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(fileOutputStream));
    }

    public NoNamesWriter(XMLStreamWriter writer) {
        super(writer);
    }

}

Вызовите так же, как описано здесь , например:

xmlmarshaller.marshal (xc, NoNamesWriter.filter (new FileOutputStream (outfile, false));

0 голосов
/ 24 августа 2012

Используйте этот атрибут в корневом элементе вашей схемы: elementFormDefault = "qualified". Например,

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...