2010-08-28 3 views
2

У меня есть строки кода, как это:JAXBContext и ИАС изменить порядок XML имен

StringWriter writer = new StringWriter(); 
JAXBContext jc = JAXBContext.newInstance(namespace); 
Marshaller marshaller = jc.createMarshaller();   
marshaller.marshal(input, writer); 

When namespace = "nfpa:nfpares". У меня есть генерируемый контент вроде этого:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ServiceRequest xmlns:ns2="nfpares" xmlns="nfpa"> 
... 
</ServiceRequest> 

, но как-то, в другой части библиотеки (который я не имею контроля), разработчик также использовать JAXBContext и те же пространство имен, но содержание генерируемое:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ServiceRequest xmlns="nfpa" xmlns:ns2="nfpares"> 
... 
</ServiceRequest> 

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

благодаря

+0

@ user267476 - используйте кнопку '101010' для форматирования кода (отступ на 4 пробела) http://stackoverflow.com/editing-help – McDowell

ответ

4

При выполнении криптографических проверки подписи на XML вам необходимо работать с XML в caninical форме. Существует множество различных возможностей сериализации для одной и той же структуры xml, которые одинаковы для анализатора xml. Например <a/> vs <a></a>, &#160; vs &#xA0; или порядок атрибутов и пространств имен. Существует стандарт для XML canonicalization который описывает следующее преобразование:

Каноническая форма документа XML является физическим представлением документа, полученного способом, описанным> в данном описании.Изменения приведены в следующем списке:

  • Документ кодируется в UTF-8
  • разрывы строк нормированы на #xA на входе, перед разбором
  • значения атрибутов нормированы, как будто проверяющего процессор
  • Характер и разобранные ссылки на объекты заменяются
  • секции CDATA заменяются их содержание символов
  • декларация XML и типа документа декларации (DTD) удаляются
  • Пустые элементы преобразуются в старт-концевые пары тегов
  • Пробелы вне элемента документа и в начальной и конечной метками нормализуется
  • Все пробелы в содержании символов сохраняется (за исключением символов, снятые во время линии подачи нормализации)
  • значение атрибута ограничители устанавливаются в кавычки (двойные кавычки)
  • специальных символы в значениях атрибутов и содержании символов заменяется символом ссылается
  • Лишних объявления пространства имен удаляются из каждого элемента
  • по умолчанию атрибутов добавляются к каждому элементу
  • лексикографического порядок накладывается на объявления пространств имен и атрибуты каждого элемента

Реализацию этого метода можно найти в apache xml security project в классе Canonicalizer

+0

В отличном XOM p есть еще одна реализация Canonicalizer ackage (http://www.xom.nu/apidocs/nu/xom/canonical/Canonicalizer.html) – skaffman

Смежные вопросы