【问题标题】:XML to XML translation in JavaJava 中的 XML 到 XML 的转换
【发布时间】:2010-01-09 10:16:57
【问题描述】:

我需要在 Java 中从 XMI 转换为 OWL(XML/RDF 序列化),所以本质上这是 XML 到 XML 的转换,很可能我可以使用正则表达式并使用 replaceAll 来满足我的需要,但这看起来很混乱方法来做到这一点。 您有什么建议以便以后可以轻松定制(我的 OWL 模型将来可能会略有变化)?

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

【问题讨论】:

    标签: java xml translation owl xmi


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        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 和两阶段方法。

        【讨论】:

          【解决方案4】:

          我同意 rsp 和 cb160 的观点,即 XSLT 是完成这项工作的工具。

          如果您使用的是 unix 平台,您可以考虑使用xsltproc 在命令行上测试转换。根据我的经验,如果您不熟悉 XSL,这确实可以加快开发时间。

          【讨论】:

            【解决方案5】:

            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 图中的数据是无序的。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-02-07
              • 1970-01-01
              • 1970-01-01
              • 2017-04-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多