Как я могу демонтировать сообщение, которое было маршалировано, используя локальную часть QName, отличную от ожидаемой?
Мой пример ниже:
Учитывая объект для демаршалирования, который был создан с использованиемметод маршала, такой как
marshaller.marshal( new JAXBElement(
new QName("urn:somenamespace","DifferentNameMessage"),
OriginalMessageType.class,
originalMsg),
result);
(Как я понимаю, этот фрагмент кода указывает на то, что QName заставляет корневой элемент использовать тег имени-заместителя, отличный от того, который указан в исходной схеме. По сути, используется заменаМетод имени. Например, в приведенном выше QName исходный тег был бы «NameMessage», но сообщение было упорядочено с использованием локальной части «DifferentNameMessage».)
Обычно я использовал бы метод демаршаллинга, такой как:
String xmlString = convertStreamToString(in);
final StringReader xmlReader = new StringReader(xmlString);
final StreamSource xmlSource = new StreamSource(xmlReader);
JAXBContext jaxbContext = JAXBContext.newInstance(OriginalMessageType.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
JAXBElement ret = null;
ret = unmarshaller.unmarshal(xmlSource, OriginalMessageType.class);
Но, если я использую этот метод, тогда имя ret JAXBElement предназначено для QName, которое использовалось для его маршалинга, но зато DeclaredType предназначено для OriginalMessageType.class, а сообщение unmarshalled содержит нулевые значения элемента для ожидаемогоподэлементы, даже если исходное сообщение содержит валиЗначения d для этих подэлементов.
Мне интересно, можно ли указать заменяющее QName во время unmarshalling, чтобы указать, что оно является заменой, а затем использовать вместо него оригинальный тег?