2010-01-09 40 views
1

我需要在Java中將XML從XMI轉換爲OWL(XML/RDF序列化),所以本質上這是XML到XML的翻譯,很可能我只能用正則表達式來使用,並使用replaceAll來滿足我需要,但這似乎很雜亂的方式來做到這一點。 你會建議什麼,以便稍後可以輕鬆定製(我的OWL模型可能會在未來稍微改變)?XML到XML在Java中的翻譯

我的想法是將XMI讀入創建的類層次結構(根據我的OWL模型),然後使用某個模板引擎將其輸出爲OWL(XML)。你知道更容易定製的簡單方法嗎?

回答

2

您可以使用XSLT將XML轉換爲XML。

OReilly文章是一個很好的開始。

0

我同意rsp和cb160 XSLT是工作的工具。

如果您使用的是unix平臺,則可以考慮使用xsltproc來測試命令行上的轉換。根據我的經驗,如果你真的不在XSL的家中,真的可以加快開發時間。

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中做到這一點(當沒有其他可用時),但使用XSLT2處理器(例如Saxon)可以使轉換更加簡潔。詢問XSLT問題的最佳地點是Mulberry list

在sourceforge上有一個工具通過GUI來完成,但我似乎無法找到它。我的中間轉換由前僱主所有。對於代碼生成或XMI到XML,我直接使用XSLT和兩階段方法。

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的縮寫格式更容易閱讀,但它是不容易的使用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文件規範形式的皮特Kirkham的的建議。在大多數情況下,給定完全相同的輸入,RDF庫會每次將這些語句序列化爲相同的格式,但從長遠來看,由於RDF圖中的數據無序,我不會依賴這個語句。