сериализация xerces в Java 6 - PullRequest
6 голосов
/ 24 мая 2010

В Java 6 полная реализация синтаксического анализатора / сериализатора XML xerces теперь находится в среде выполнения Java (rt.jar). Пакеты были перемещены в пространство имен com.sun. *, Что делает их недоступными для явной ссылки в клиентском коде. Это не проблема при использовании синтаксического анализатора, который создается с помощью фабрик, определенных API javax.

Однако наш код также использует сериализацию xerces (org.apache.xml.serialize. *). AFAICT, не существует javax.xml API-определенных фабрик для создания экземпляров Serializer и OutputFormat. Кажется, это подразумевает, что единственный способ получить его - это явно вызвать com.sun.org.apache.xml.serialize. * API.

Я обнаружил классы сериализации в javax.xml.stream, но, похоже, они не предоставляют никакого элемента управления форматированием вывода, как класс OutputFormat xerces.

Вопрос:

Есть ли способ получить доступ к функциональности сериализации xerces (которая равна в rt.jar) через API-интерфейс стандарта javax, без включения xerces.jar, а также без явного создания экземпляра com .sun. * классы?

Если нет, то есть ли совместимый с javax API способ достижения того же эффекта?

Ответы [ 4 ]

5 голосов
/ 25 мая 2010

Если вы хотите использовать функцию Xerces, которая не предоставляется через официальный java.* или javax.* API, то единственное реальное решение - включить Xerces в качестве сторонней библиотеки. Доступ к JRE-внутренней версии Xerces любым способом был бы опасен, поскольку ничто не гарантирует, что действительный JRE даже имеет эти классы (альтернативные JRE и даже другие версии того же JRE могут реализовывать API JAXP с использованием другой реализации или даже просто переместите его в другой пакет).

1 голос
/ 24 мая 2010

Если вы не хотите ссылаться на API Sun, вы можете поместить Xerces в одобренный каталог. Он заменит солнечную копию / реализацию, но тогда вы можете без проблем использовать API (это «официальный» способ сделать это).

Встроенная реализация Java не обеспечивает хорошего контроля над выводом, хотя можно получить некоторый лучший контроль над выводом, используя свойства Xerces и API, поскольку API поддерживает передачу дополнительных свойств, которые другие реализации могут счесть полезными , Сам не пробовал последний (я только по документации).

Редактировать (в ответ на комментарий): Если вы хотите использовать Xerces в среде, где вы не управляете базовым JDK, до точки, где вы можете указать свои собственные API замены для JAXP, то вам придется напрямую ссылаться на Xerces. (или ссылаться на перезапись пакета Sun).

Если вы можете поместить Xerces в утвержденный каталог (или иным образом переопределить одобренный параметр - что, откровенно говоря, маловероятно на сервере приложений, хотя я не знаю Weblogic конкретно), то способ "JDK" установить свойства для базового реализация осуществляется через TransformerFactory.setAttribute , который в зависимости от реализации может взаимодействовать с Transformer.setParameter .

Я должен добавить, что если базовой версии, которая объединяет Sun, будет достаточно, и если Weblogic ее использует (или использует свои собственные Xerces, если этого достаточно), тогда вам может повезти, и вы сможете просто передать свойства и пусть это сработает.

1 голос
/ 24 мая 2010

Насколько я знаю, для этого нет официального API.API Java XML, как ни странно, предназначены только для анализа XML.

Однако вы можете использовать API преобразования XML для записи DOM Document в файл.См. этот пример .

0 голосов
/ 24 мая 2010

javax.xml.bind.JAXBContext? Если вы пытаетесь связать / сериализовать объекты в XML, JAXB является стандартом. Если вы выполняете сырой анализ, org.xml.sax и / или org.w3c.dom должны иметь то, что вы ищете.

ОБНОВЛЕНО: Должны помочь пакеты com.javax.transform. Взгляните на пример Трансформера здесь .

...