Я пытаюсь написать инструмент преобразования, который берет унаследованный XML-документ (привязанный к oldSchema.xsd) и преобразует его в новый формат XML (придерживающийся newSchema.xsd).
Возможно, я 'Я делаю это совершенно неправильно, но первым шагом было создание промежуточной схемы, которую проверяют как старые, так и новые XML-документы.Например, предположим, у меня есть XML-документ
<Doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="old oldSchema.xsd" xmlns="old">
<OldElement/>
</Doc>
, и я хочу преобразовать его в
<Doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="new newSchema.xsd" xmlns="new">
<NewElement/>
</Doc>
oldSchema.xsd, определяющий Doc как последовательность с обязательным элементом OldElement.newSchema.xsd определяет Doc как последовательность с обязательным элементом NewElement.Моя промежуточная схема имеет последовательность с выбором либо OldElement, либо NewElement.
Очевидно, что здесь есть больше контента, с которым мне нужно иметь дело программно.Перед демаршализацией XML-файла OldElement мне нужно заменить пространство имен «старое» на мое промежуточное пространство имен, чтобы я мог использовать экземпляр JAXB, созданный с моим промежуточным контекстом.
Возможно ли это?Я попытался реализовать свой собственный XMLStreamReader
, который делегирует XMLInputFactory.newInstance().createXMLStreamReader()
для всех методов, кроме getNamespaceURI(*)
.Для них я реализовал что-то вроде
public String getNamespaceURI() {
String existingNS = delegate.getNamespaceURI();
return subs.get(existingNS) == null ? existingNS : subs.get(existingNS)
}
, где subs в моем примере выше отображали пространство имен «old» на пространство имен «new».Я повторил это для всех getNamespaceURI(*)
методов в XMLStreamReader.Затем я передал экземпляр моего NamespaceSubstitutionXMLReader
на unmarshaller.unmarshal(XMLStreamReader)
.В немарсализованном объектном дереве был корневой узел правильного типа, но все его подэлементы были нулевыми.Я не совсем понимаю, почему этот подход не сработал, но опять же, я совсем не знаком с реализацией Unmarshaller.
Любая помощь очень ценится.