2014-02-20 59 views
2

基本上我想創建一個XSD的狀態轉換圖表示。這不是一個簡單的狀態圖。它應該反映合成器(全部,選擇,序列),最小和最大出現次數以及派生(限制,擴展)。 XSD遍歷器必須能夠做的事情是在每次將XML標記提供給它時​​更新其在XSD的狀態圖表示中的位置。它應該在標籤附近回滾它的位置。它應該能夠確定是否向其提供XML標記會使XML無效,即傳送程序無法找到給定XML標記的路徑。XSD Walker - 遍歷一系列XML標記開頭和結尾作爲輸入的XSD

我一直在使用XSOM,它是仿函數訪問器體系結構,但我無法實現使用XSOM的合成器,事件和派生。

你們中的任何一個人都知道任何已經這樣做的圖書館?

或者有關如何構建這種狀態轉換圖的任何想法?

或者更好的是,你們提供了鏈接到XML驗證器的代碼?這基本上就是XML驗證器在針對XSD權限驗證XML時執行的操作。

回答

1

所以你想構建一個XML驗證器,它是一個狀態機。它採用ans XSD作爲輸入並構建狀態機。然後,機器運行一個XML並計算它是否有效。你想要運行可視化?

XSOM是您用於解析XSD的庫。這裏有一個user guide概述了API。 XSD內容將成爲您的狀態機的狀態。這應該類似於爲正則表達式構建狀態機。

我會用簡單的元素來創建一些州開始,例如採用此架構(more examples here):

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="shiporder" type="xs:string" /> 
</xs:schema> 

你會創建一個startend狀態。然後爲元素創建一個狀態shiporder。你從start狀態開始。當您遇到<shiporder>標記時,會出現從startshiporder狀態的轉換。當您遇到shiporder狀態的字符串內容時,您會保持shiporder狀態。當你遇到結束標記</shiporder>時,你會進入end狀態。如果遇到沒有定義的轉換的情況,則驗證失敗。

其他元素當然需要更復雜的邏輯。例如,<xs:sequence>可能會轉換爲多個元素。

然後你會使用SAX來讀取XML。發出的事件是觸發轉換的狀態機的輸入事件。

最後你會有一個或幾個接受狀態。當機器停在其中一個機器上時,XML是有效的。

對於狀態機你可能使用一個從this question。也許你發現了一些可視化的,或者你使用像一個DFA Simulator

+0

這就是我想要的。如果我只考慮給定元素的可能子元素,創建狀態圖非常簡單。然而,我很難爲序列,選擇,最小 - 最大值事件,擴展/重新創建狀態轉換邏輯。我正在尋求一種方法來實現這些狀態轉換邏輯。 – Ram

+0

你知道如何爲正則表達式構建狀態機嗎?應該有足夠的資源,例如[此視頻](http://www.youtube.com/watch?v=GwsU2LPs85U)。你的序列'ab',選擇'a | b',min-max'a {3,5}'也都存在於正則表達式中,只有你有字符而不是標籤,所以你應該可以使用相同的方法和原則。儘管擴展和限制可能需要特殊處理。 – amoebe

1

或者更好的是,你們提供的鏈接,爲XML校驗碼? 這基本上就是XML驗證驗證XML 當對一個XSD的權利呢?

看一看The Apache Xerces Project。由於您已經爲Java問題添加了標籤,因此請特別注意Xerces2 Java Parser,這是一個完全符合標準的驗證XML解析器。

對於給定的XML模式,Xerces可以構建reusable grammar。檢查出xni.XMLGrammarBuilder sample

Xerces代碼編寫得很好,它的XML和XSD(包括合成器,事件和派生)的實現是堅實的。它將成爲你尋求建立的國家轉型圖表的良好基礎和實施思想的良好來源。