Действительно ли возможно настроить префикс пространства имен, который JAXB использует при маршалинге для Строки?

Например, у меня есть простая схема, которая импортирует другую схему. Вторая схема (urn:just:attributes, просто-attributes.xsd) просто определяет группу атрибута.

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/MySchema"
    xmlns:tns="http://www.example.org/MySchema" 
    elementFormDefault="qualified"
    xmlns:ja="urn:just:attributes">

    <import schemaLocation="just-attributes.xsd" namespace="urn:just:attributes"/>

    <element name="MyElement">
        <complexType>
            <attributeGroup ref="ja:AttributeGroup"/>
        </complexType>
    </element>
</schema>

Я использую Метро xjc задача Ant для генерации классов прочь этой схемы. Проблема, с которой я сталкиваюсь, состоит в том, что приложение сторонних производителей, с которым я взаимодействую, является странным о пространствах имен. Этот случай мне нужно Строковое значение, таким образом, я должен сериализировать его. Я использую шаблонный код для этого.

private static <T> String marshal(T object) throws JAXBException{
    OutputStream outputStream = new ByteArrayOutputStream();
    JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());
    Marshaller marshaller = jaxbContext.createMarshaller();
    marshaller.marshal(object, outputStream);
    return outputStream.toString();
}

Который дает мне что-то вроде

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:MyElement xmlns:ns1="urn:just:attributes" xmlns:ns2="http://www.example.org/MySchema" ns1:attrib1="1234" ns1:attrib2="5678"/>

Проблема, которую я имею, состоит в том, что это третье лицо ожидает что-то как xmlns:thirdpartyns="urn:just:attributes", который должен сказать, они анализируют на основе имени, данного пространству имен. Это должен быть "thirdpartyns" для их программного обеспечения для работы.

Кто-либо знает о пути вокруг этого, за исключением выполнения находки и замены в получившей строке? Пользовательское обязательное правило, возможно?

25
задан 31 December 2009 в 15:18
поделиться

2 ответа

http://hwellmann.blogspot.com/2011/03/jaxb-marshalling-with-custom-namespace.html

Здесь показано, как это сделать.

Другой: http://www.systemmobile.com/?p=280

Ключевые биты на случай, если эта ссылка тоже умирает:

класс NamespacePrefixMapper, находящийся в пакете com.sun.xml.bind.marshaller. У абстрактного класса есть один метод для реализации:

public abstract String getPreferredPrefix(  
     String namespaceUri,         
     String suggestion,         
     boolean requirePrefix); 

, затем

Marshaller marshaller =        
    jaxbContext.createMarshaller();        
marshaller.setProperty(”com.sun.xml.bind.namespacePrefixMapper”,        
    new MyNamespacePrefixMapper());  

Если вы также используете javax.xml.xpath.XPath, ваш NamespacePrefixMapper также может реализовать javax.xml.namespace.NamespaceContext, централизовав настройку пространства имен в одном учебный класс.

27
ответ дан 28 November 2019 в 21:06
поделиться

Существует способ сделать это, который использует внутренний класс реализации JAXB под названием NamespacePrefixMapper. В JAXB RI это в com.sun.xml.bind.marshaller, но в Java6 это в com.sun.xml.internal.bind.marshaller.

Это абстрактный класс, который можно разбить на подклассы и реализовать абстрактный метод, который отображает URI пространства имён на префиксы.

Затем вы вводите экземпляр этого подкласса в marshaller:

JAXBContext context = ...
Marshaller marshaller = context.createMarshaller();
NamespacePrefixMapper prefixMapper = new MyPrefixMapperImpl();
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", prefixMapper);

Имя свойства будет другим для версии Java6, но вы получите эту идею.

Обратите внимание, что это внутренний класс реализации JAXB, поэтому нет никакой гарантии, что он будет там в будущих версиях.

0
ответ дан 28 November 2019 в 21:06
поделиться