Перевод XML в XML на Java - PullRequest
       21

Перевод XML в XML на Java

1 голос
/ 09 января 2010

Мне нужно перевести из XMI в OWL (сериализованный XML / RDF) в Java, так что, по сути, это перевод из XML в XML, и, скорее всего, я мог бы просто поиграть с регулярным выражением и использовать replaceAll для того, что мне нужно, но это выглядит очень грязно способ сделать это. Что бы вы предложили, чтобы его можно было легко настроить позже (моя модель OWL может немного измениться в будущем)?

Моя идея заключалась в том, чтобы прочитать XMI в созданную иерархию классов (в соответствии с моей моделью OWL), а затем с помощью какого-либо механизма шаблонов вывести его в виде OWL (XML). Знаете ли вы более простой способ, который можно легко настроить?

Ответы [ 5 ]

4 голосов
/ 09 января 2010

XSL Transformations идеально подходит для такой работы, фактически она предназначена для: -)

Чтобы начать с XSLT, взгляните на ссылку zvon и ее учебник.

2 голосов
/ 09 января 2010

Вы можете использовать XSLT для преобразования XML в XML.

Эта статья OReilly является хорошим началом

1 голос
/ 09 января 2010

XMI - не очень хороший формат для прямого преобразования в OWL - в XMI есть много разных структур, имеющих одинаковое значение (@stereotype="foo", stereotype/@name="foo" и stereotype/@xmi:id="{id of the foo stereotype}" все означают одно и то же) - я настоятельнопосоветуйте использовать двухэтапный процесс, в котором XMI сначала преобразуется в каноническую форму, где такие ссылки разрешаются и любая информация, которую вы не хотите отображать в OWL, удаляется.

Функция клавиши XSLT и элемент окажутся полезными, если вы не знакомы с ней.Хотя вы можете сделать это в XSLT1 (и я сделал это, когда не было других доступных), работа в процессоре XSLT2, таком как Saxon , делает преобразование намного более кратким.Лучшее место, чтобы задать вопросы XSLT - это Список Mulberry .

Был инструмент на sourceforge, который делал это через графический интерфейс, но я не могу его найти.Мои промежуточные преобразования принадлежат предыдущему работодателю.Для генерации кода или XMI to XML я использую XSLT напрямую и двухэтапный подход.

0 голосов
/ 09 января 2010

XSLT предназначен для обработки деревьев узлов XML. Хотя существуют сериализации RDF, которые представляют собой «дерево» узлов XML (RDF / XML и RDF / XML-Abbrev), базовой моделью данных RDF является граф.

Если ваш результирующий RDF-график также не является деревом, вам придется делать грязные вещи в вашем XSLT, чтобы проходить по ссылкам, и может пострадать производительность / ремонтопригодность / здравомыслие. Просто помните об этом, если вы измените формат OWL, а затем захотите преобразовать его обратно в XML без RDF.

Простой (древовидный) пример выглядит следующим образом:

## Foo has two types
@prefix e: <uri://example#>.
e:Foo a e:Bar.
e:Foo a e:Baz. # Second statement about e:Foo

Для преобразований обратно в XML без RDF, если вы используете самую основную форму RDF / XML, вы получите список операторов RDF непосредственно под элементом rdf:RDF верхнего уровня. Их преобразование может включать поиск по всему списку операторов снова и снова.

<rdf:RDF xmlns:e="uri://example#"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about="uri://example#Foo">
    <rdf:type rdf:resource="uri://example#Baz"/>
  </rdf:Description>
  <rdf:Description rdf:about="uri://example#Foo">
    <rdf:type rdf:resource="uri://example#Bar"/>
  </rdf:Description>
</rdf:RDF>

Вам может показаться, что формат RDF / XML-Abbrev проще для чтения, но с XSLT его нелегко обработать, поскольку модель данных RDF неупорядочена и один граф может иметь много эквивалентных (но несовместимых с вашими XSLT) XML-форм. В приведенном выше примере можно сериализовать одно из следующих:

<!-- Bar is the containing element -->
<rdf:RDF xmlns:e="uri://example#"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <e:Bar rdf:about="uri://example#Foo">
    <rdf:type rdf:resource="uri://example#Baz"/>
  </e:Bar>
</rdf:RDF>

<!-- Baz is the containing element -->
<rdf:RDF xmlns:e="uri://example#"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <e:Baz rdf:about="uri://example#Foo">
    <rdf:type rdf:resource="uri://example#Bar"/>
  </e:Bar>
</rdf:RDF>

Предложение Пита Киркхема о создании канонической формы для сериализации поможет вам в написании XSLT. В большинстве случаев при одинаковых входных данных библиотека RDF будет сериализовать операторы в один и тот же формат каждый раз, но я не буду зависеть от этого в долгосрочной перспективе, поскольку данные в графе RDF неупорядочены.

0 голосов
/ 09 января 2010

Я согласен с rsp и cb160, что XSLT - это инструмент для работы.

Если вы работаете на платформе Unix, вы можете рассмотреть xsltproc , чтобы проверить преобразования в командной строке,По моему опыту, это действительно может ускорить время разработки, если вы не совсем дома с XSL.

...