Схема XML.Обработка значений атрибутов с учетом пространства имен - PullRequest
3 голосов
/ 24 октября 2011

Часть моего проекта включает в себя серьезные преобразования пользовательских документов схемы.Мне нужно иметь возможность изменять целевые пространства имен, поддерживать перекрестные ссылки типов и строить wsdl на нескольких документах схемы.Одной из наиболее часто используемых операций является изменение префикса пространства имен перед импортом схемы в файл wsdl.Я использую org.xml.sax.ContentHandler и это startPrefixMapping метод для обработки пространств имен.Все работает нормально и безупречно, если только я не хочу менять типы элементов.

Вот простой фрагмент схемы

<schema xmlns="http://www.w3.org/2001/XMLSchema">
  <complexType name="Param">
    <sequence>
      <element name="key" type="string"/>
      <element name="value" type="string"/>
    </sequence>
  </complexType>
<!-- omitted -->

, который должен быть помещен внутри wsdl следующим образом:

<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <types>
    <xs:schema>
      <xs:complexType name="Param">
        <xs:sequence>
          <xs:element name="key" type="xs:string"/> <!-- 'xs:' to be added -->
          <xs:element name="value" type="xs:string"/> <!-- 'xs:' to be added -->
        </xs:sequence>
      </xs:complexType>
<!-- omitted -->

Проблема в том, что некоторые значения атрибутов схемы (type в <element>, base в <extension>) учитывают пространство имен и могут быть изменены в приведенном выше примере.Как я вижу, ни DOM, ни SAX-парсеры не могут справиться с этой ситуацией, поэтому в настоящее время я использую уродливые строковые операции для извлечения информации о пространстве имен из определенных значений атрибутов.

Я что-то пропустил?Существуют ли какие-либо API-интерфейсы, библиотеки или другие специфичные для схемы инструменты для решения таких задач?

Ответы [ 2 ]

3 голосов
/ 24 октября 2011

да, это серьезная ошибка в xml schema / wsdl. Использование префиксов пространств имен xml внутри значений атрибутов было гигантской ошибкой (поскольку сами значения префиксов не имеют значения, только заполнители для реальных пространств имен). к сожалению, я не знаю ни одного хорошего решения проблемы (мне пришлось реализовать практически такую ​​же идею: объединение нескольких пользовательских схем в одну схему / wsdl). я знаю, что у xerces есть модель xml-схемы api , но я не знаю, поддерживает ли она объединение нескольких схем и генерирование полученного результата.

1 голос
/ 24 октября 2011

SAX - это очень низкий уровень, используемый для чтения документов схемы.Вы избавитесь от многих хлопот, если перейдете на интерфейс более высокого уровня, например XSLT.Вы избавитесь от лишних хлопот, если прочитаете документы схемы с помощью процессора схемы, который превращает их в модель компонентов схемы - это могут сделать как Xerces, так и Saxon, и они не одиноки.

...