Java中的XML到XML转换

时间:2010-01-09 10:16:57

标签: java xml translation owl xmi

我需要在Java中从XMI转换为OWL(XML / RDF序列化),所以基本上这是XML到XML的翻译,我最有可能只使用正则表达式并将replaceAll用于我需要的东西,但这看起来非常混乱这样做的方式。 您会建议什么,以便以后可以轻松定制(我的OWL模型将来可能会略有变化)?

我的想法是将XMI读入已创建的类层次结构(根据我的OWL模型),然后使用一些模板引擎将其输出为OWL(XML)。您是否知道可以轻松定制的更简单方法?

5 个答案:

答案 0 :(得分:4)

XSL Transformations非常适合这种工作,事实上它是为它设计的: - )

要从XSLT开始,请查看zvon reference及其教程。

答案 1 :(得分:2)

您可以使用XSLT将XML转换为XML。

这篇OReilly文章是一个很好的起点。

答案 2 :(得分:1)

XMI不是直接转换为OWL的非常好的格式 - 在XMI中有许多不同的结构具有相同的含义(@stereotype="foo"stereotype/@name="foo"stereotype/@xmi:id="{id of the foo stereotype}"都意味着同样的事情) - 我强烈建议使用两阶段过程,其中XMI首先被转换为规范形式,其中此类引用被解析,并且您不想映射到OWL的任何信息被移除。

如果您不熟悉,XSLT key function and element将证明是有用的。虽然你可以在XSLT1中做到这一点(我没有其他可用的时候),但在Saxon等XSLT2处理器中工作会使转换变得更加简洁。提出XSLT问题的最佳地点是Mulberry list

sourceforge上有一个工具可以通过GUI完成,但我似乎无法找到它。我的中间变换由前雇主拥有。对于代码生成或XMI到XML,我直接使用XSLT和两阶段方法。

答案 3 :(得分:0)

我同意rsp和cb160,XS​​LT是这项工作的工具。

如果您使用的是unix平台,可以考虑xsltproc来测试命令行上的转换。根据我的经验,如果你不是真的在家里使用XSL,那么真的可以加快开发时间。

答案 4 :(得分:0)

XSLT旨在处理XML节点的树。虽然RDF序列化是XML节点的“树”(RDF / XML和RDF / XML-Abbrev),但底层的RDF数据模型是图形。

如果生成的RDF图也不是树,那么您将不得不在XSLT中执行脏事来遍历引用,并且性能/可维护性/健全性会受到影响。如果您修改OWL格式然后想要转换回非RDF XML,请注意这一点。

一个简单的(树)示例如下:

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

对于转换回非RDF XML,如果您使用最基本的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>

Pete Kirkham关于为序列化创建规范形式的建议将帮助您编写XSLT。在大多数情况下,给定完全相同的输入,RDF库每次都会将语句序列化为相同的格式,但从长远来看,我不会依赖于此,因为RDF图中的数据是无序的。