2010-05-24 3 views
6

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

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

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

Вопрос:

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

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

ответ

5

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

+0

Здесь мы начали, и мы пришли к выводу. Если вы хотите использовать части Xerces, отличные от Java-API (в частности, сериализацию), нет никакого способа включить Xerces. Мы изменили нашу кодовую базу, чтобы удалить явное упоминание классов Xerces в свойствах системы, позволяя использовать значения по умолчанию при создании парсеров и трансформаторов. Это должно предотвращать конфликты при загрузке, поскольку все значения по умолчанию находятся в com.sun. * –

1

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

Вы можете, однако, использовать XML Transformation API для записи DOM Document в файл. См. this example.

+0

Теперь я изучаю API преобразования. Кажется, у него нет гибкости в определении форматирования, доступного через OutputFormat, если только он не использует сериализацию xerces под обложками, и есть способ получить параметры для сериализатора. –

0

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

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

+0

Нет, я не привязываю объекты Java к XML. Речь идет о сериализации DOM, и ничего, кроме API-интерфейсов сериализации xerces/xalan, как представляется, не обеспечивает никакого контроля над форматированием вывода (отступы, пробелы и т. Д.). –

1

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

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

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

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

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

+0

Мы использовали бы поддерживаемый каталог, но мы пытаемся развернуть наш продукт в WAR/EAR в среде WebSphere с очень строгими требованиями безопасности. Где в API вы видите возможность передачи дополнительных свойств в базовую реализацию xerces? –

+0

@Jim, я отредактировал свой ответ, чтобы предоставить некоторые ссылки. – Yishai

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