2012-02-27 57 views
2

我不是java中的新手,而是XML和DTD文件中的新手。我有一個工具(我寫的)將項目保存爲XML。您可以從主項目創建應用程序,但我必須根據主項目檢查應用程序的有效性。因此,對於每個主要項目,我必須創建一個DTD文件以及XML文件。這樣我可以檢查應用程序(也是XML文件)再次檢查該DTD文件。我如何使用Java生成該dtd文件。如何使用java生成DTD文件

+0

如果你只是生成它,DTD將是無用的,它不會檢查任何有用的東西。聽起來你所有的項目XML文件都應該根據相同的DTD進行驗證。 – 2012-02-27 20:48:40

回答

0

我建議你使用XML模式的.xsd而不是DTD。

它擁有超過一個DTD幾個優點:

  1. 的.XSD XML; DTD不是。
  2. 模式將比DTD做更徹底的檢查。它可以強制執行的類型,正則表達式,枚舉等
  3. 喜歡的IntelliJ智能IDE可以從現有的XML爲你生成一個模式,反之亦然。

模式是很容易用文本編輯器來生成。我認爲這是一個值得的練習。

我不會推薦在任何情況下生成這樣的事情。您正在表達關於架構或DTD中文檔的大量知識。

0

的DTD往往得到一個壞名聲,而且往往較差的考慮的原因,如人們可稱之爲「開發商代言和時裝」(例如,最新的東西就是最好的東西)。例如,認爲DTD不是XML是很奇怪的。我認爲人們通常意味着DTD的語法不是XML文檔標記語法,這是正確的。但dtd是本質 XML,也就是說,它們是XML推薦的非常重要的一部分,肯定moreso比XML Schema,它像XML命名空間後來大批的附加建議,其中提出了一個棘手的問題「之一什麼是兼容的XML文檔?「但我們在這裏不會碰到那個。什麼確定是每個合規的XML處理器都需要支持DOCTYPE聲明和DTD處理;它是免費的,你不需要別的東西。而諸如Apache目錄解析器之類的項目同時支持TR 9401和XML目錄(「實體解析」),該解決方案在開源和商業產品方面有着悠久的行業支持歷史。

相比之下,所有XML處理器都不支持XML Schema(或至少一致如此),並且XSD鏈接到文檔實例的方式通過一些相當複雜的XML名稱空間屬性來處理文檔實例的一部分(根元素上的屬性),而不是序言的一部分。 (基本上,這意味着處理器必須在獲取模式之前開始處理文檔,如果您不瞭解這種區別的重要性,則應該做一些作業)。使用多個XSD的混合文檔類型之間的相互依賴關係很複雜且沒有詳細說明。您可能會發現您必須提供您自己的實體解決方案支持。

而且具有XML標記你的架構並不總是有益的,除非你打算通過軟件工具來管理他們。 DTD更具人類可讀性,儘管存在一些相反的意見,但您可以使用命名空間前綴(請參閱XHTML Modularisation)。如果您的驗證要求主要是結構性的(例如,您的內容是以文檔爲中心而非以數據爲中心的),那麼您可能不會驗證內容,而是驗證標記。 DTD對此很好。您也可以考慮完全不同的驗證和文檔約束方法,比如Schematron,它很好地增強了DTD驗證。最後,大多數可以生成XSD的工具也可以生成DTD,並且有可用的轉換應用程序(請參閱James Clark的trang)。

DTD也會和XML一樣長,比如50-100年。從長遠來看,我們可能會發現XML Schema將無法生存:它只是衆多可行的競爭對手中的一個,因爲XSD的許多缺陷,競爭對手到達現場。我發現DTD和Schematron的組合非常適合我的需求,並且是一個靈活的解決方案。但是YMMV。

總之,在接受通用的分散式建議之前,您應該真正看看您的實際模式/約束要求。你可能會發現DTD工作得很好。他們自1971年左右開始就這樣做了。

+0

「... DTD更易於人類閱讀......」 - 您的意見;我不同意。沒有人知道XML是否能夠存活50 - 100年。更多的猜測。處理模式現在已內置到Java JDK中,因此您關於一致支持的聲明不再正確。 DTD可能早於XML,但XML規範本身可追溯到1998年:http://www.w3.org/2003/02/xml-at-5.html – duffymo 2012-02-27 23:45:51

+0

您顯然從未嘗試過讀取或編輯XML模式中的複雜內容模型。您可以在文本編輯器中使用DTD進行此操作;在XSD中,你最好使用一個工具,否則你會很快失去。我很清楚SGML和XML規範的日期,所以我不確定你的意思。 SGML的根源可以追溯到60年代,至於XML,我一開始就在那裏,並收到了第一個規範的打印副本。自80年代後期以來,我一直使用SGML(工作於工業領域),所以我可以說一些在專業環境中負責DTD和XSD的經驗。 – 2012-05-08 01:16:58

+0

現在就開始迴應?我們都會保留我們的意見。你的評論並不能說服我。 – duffymo 2012-05-08 01:24:16

1

我這樣做的方式是使用JAXB對象和註釋,而XSD代替DTD。

  • 創建JAXB與代表你的XML的結構標註Java對象,
  • 寫(「馬歇爾」),以使用Marshaller
  • 使用schemagen產生從JAXB對象和XSD文件的註釋。

作爲獎勵,JAXB將允許您將XML讀回到您的對象結構中。