2012-02-06 51 views
9

我有一個XML模式,其中包含多個導入,其中又包含導入。我需要生成語義相同的模式,其中所有導入都是內聯的。我想替換這些:XML模式:用相應的模式替換導入

<xs:import namespace="http://some.name/" schemaLocation="./path/to/it.xsd"/> 

與參考模式的內容。我需要將輸出作爲一個字符串,而不是一些內部表示。我試過Apache Xerces,但沒有找到將XSModel寫入字符串的方法。在那兒?

我試過Apache XmlSchema 2,但是當它寫入XML Schema時,它並不會用模式替換導入聲明。

有什麼圖書館可以做到嗎?有什麼建議麼?

謝謝。

+1

爲什麼你需要這樣做? – 2012-02-06 12:51:18

+0

這是一個很長的故事,這是一個可能的解決方案,我有一個問題 – Thresh 2012-02-06 14:05:34

回答

10

xsd:include通常可以內聯,但是xsd:import不能。這是因爲xsd:import用於引用不同目標命名空間的模式文檔,並且在同一模式文檔中不能使用具有不同目標命名空間的組件。

5

如指出herehere,XSD的每個文件有一個目標命名空間的限制使得您的「語義等價」請求無法解決。在所有使用名稱空間本身來定義(或改進)語義集的邊界的情況下,這都是正確的,也是典型的。對於一次或設計時重構,您不必以循環方式或動態編程方式處理這樣的事情,您也可以嘗試看一下here;也許在你的情況下問題不是不支持導入(我會覺得奇怪),而是包含/導入的複雜性使得圖形對於你的工具來說太複雜了。正如後一篇文章所顯示的那樣,通過摺疊包含,減少所需進口數量的淨效應,問題就解決了。或者,如果某種程度上你的「語義等價」不涉及名稱空間(例如,我曾經見過那些對XSD開發關係模型感興趣的人),但通過重構可能會將所有命名空間合併爲一個(或者沒有,即沒有目標命名空間),然後將其提供給您的工具。從自動重構的角度來看,唯一可以確保在不同命名空間中不存在重複的已命名XSD組件;例如不能在不同名稱空間中爲元素,類型,屬性或組等命名。