Например, у меня есть простая схема, которая импортирует другую схему. Вторая схема (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" для их программного обеспечения для работы.
Кто-либо знает о пути вокруг этого, за исключением выполнения находки и замены в получившей строке? Пользовательское обязательное правило, возможно?
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, централизовав настройку пространства имен в одном учебный класс.
Существует способ сделать это, который использует внутренний класс реализации 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, поэтому нет никакой гарантии, что он будет там в будущих версиях.