JAXB: Удалить сообщение с помощью QName? - PullRequest
0 голосов
/ 24 августа 2010

Как я могу демонтировать сообщение, которое было маршалировано, используя локальную часть 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, чтобы указать, что оно является заменой, а затем использовать вместо него оригинальный тег?

1 Ответ

1 голос
/ 24 августа 2010

Правильно следующее:

ret = unmarshaller.unmarshal(xmlSource, OriginalMessageType.class); 

Это то, как вы сделали свой JAXBContext, когда ваш маршалл?

JAXBContext jaxbContext = JAXBContext.newInstance(OriginalMessageType.class);  

Что попробовать:

  1. Вы убедились, что документ с маршалингом верен?
  2. Что происходит, когда вы используете один и тот же JAXBContext для маршала и немаршала?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...