Скажем, у меня есть XML-документ (представленный в виде текста, W3C DOM и т. Д.), А также XML-схема. В документе XML есть все правильные элементы, определенные в схеме, но в неправильном порядке.
Как использовать схему для «переупорядочивания» элементов в документе в соответствии с порядком, определенным схемой?
Я знаю, что это должно быть возможно, возможно, с использованием XSOM , поскольку генератор кода JAXB XJC аннотирует свои сгенерированные классы с правильным порядком сериализации элементов.
Однако я не знаком с API-интерфейсом XSOM, и он довольно плотный, поэтому я надеюсь, что один из вас имеет некоторый опыт работы с ним и может указать мне правильное направление. Что-то вроде «какие дочерние элементы разрешены внутри этого родительского элемента и в каком порядке?»
Позвольте мне привести пример.
У меня есть такой XML-документ:
<A>
<Y/>
<X/>
</A>
У меня есть XML-схема, которая говорит, что содержимое <A>
должно быть <X>
, за которым следует <Y>
. Теперь ясно, что если я попытаюсь проверить документ по схеме, он потерпит неудачу, поскольку <X>
и <Y>
находятся в неправильном порядке. Но я знаю, что мой документ заранее «неправильный», поэтому я пока не использую схему для проверки. Однако я делаю знаю, что в моем документе есть все правильные элементы, определенные схемой, только в неправильном порядке.
Что я хочу сделать, так это программно изучить схему (возможно, используя XSOM - объектную модель для XML-схемы) и спросить ее, каким должно быть содержимое <A>
. API предоставит информацию о том, что «вам нужно <X>
, за которым следует <Y>
».
Итак, я беру свой XML-документ (используя DOM API) и реорганизую его, и, соответственно, теперь документ будет проверен по схеме.
Важно понимать, что XSOM здесь - это java API, который представляет информацию, содержащуюся в XML-схеме, , а не информацию, содержащуюся в моем экземпляре документа.
Что я не хочу делать, так это генерировать код из схемы, поскольку схема неизвестна во время сборки. Кроме того, XSLT бесполезен, так как правильное упорядочение элементов определяется исключительно словарем данных, содержащимся в схеме.
Надеюсь, теперь это достаточно явно.