我們常常會碰到需要處理以各種格式(從以逗號或製表符做分隔符號的檔案到更負載的格式)保存或傳輸的資料的情況,對每種格式你都需要對應的解析器(parser)。這項缺點減緩了開發進度,而且可能會導致錯誤的發生。一個解決方案就是把常用格式的資料轉換成xml文檔,然後對它進行保存、處理或轉換成其它格式。
一個實例
現在已經有好多種實作在軟體內部或軟體之間進行資料保存、匯出、匯入以及傳輸功能的資料格式。最常見的是定界格式(delimited format),如逗號或製表符分隔資料格式以及定長資料格式。假設我們有一個地址簿程序,該程序提供把資料導出成逗號分隔以及固定長度這兩種格式的功能。
在逗號分隔格式中,用逗號來分隔同一個資料記錄中的不同字段,如清單A所示。而在固定長度資料格式中,記錄的每一個欄位都應該有一個標準長度。清單B給了一個固定長度格式的地址簿。
建立XML文件
現在,讓我們解析輸入資料並把它轉換成XML文件。 XML文檔(即org.w3c.dom.Document)是全部文檔物件模型(DOM)的原始資料類型,並且它提供了對文檔資料的存取。
你可以用執行buildDocument(InputStream is)方法來建立與你的資料對應的文檔,如程式碼清單C所示。此方法逐行讀取輸入資料流,並根據給定格進行來逐行分析。
如果你想解析分界格式數據,你需要建立建構函式為PlainTextToXmlFormatter(String[ ] colName,String delim)的類別的實例,其分界符可以是任何字串。在固定長度格式的情況下,你應該使用第二種建構子PlainTextToXmlFormatter(String[ ] colName,int[ ] colLen),它的一個參數是欄位長度陣列。在我們所給的地址簿範例中,各欄位的長度分別為10、10、30以及10個字元。參數colName是保存了目標資料記錄的名字的數組,在我們給的這個例子中,名字分別為名(firstName)、姓(lastName)、email以及電話號碼(phone)。
把資料行轉換成資料符號的實際解析過程也就是執行getStringArray(String read,String delim)或parseFixedLengthMessage(String read,int[ ] colLen)方法的過程。其回傳值是一個String型數組,這個數組是上述兩個方法把給定輸入進行分解而得來的。如果資料格式不對,就會拋出例外並且終止解析過失。呼叫setSkipError(true)方法就可以忽略例外並完成資料解析過程。呼叫這個方法可以防止拋出例外,但它仍允許程式向錯誤輸出流列印錯誤訊息。
當行被解析成標記後,它們作為XML文件的元素而加入XML文件之中。放入到元素之中的每一行記錄都有一個預設的名字line,你也可以呼叫setDataLineName()來指定名字。每一個資料記錄都是一個列元素,列元素的名字由對應的類別構造函數提供,子元素加到行元素之中。
在輸入資料完全讀取之後,你就得到了一個有效的XML文檔,你可以進一步處理這個文檔。現在,由於資料是按眾所周知的樹狀結構來組織的,因此處理它非常簡單。例如,你可以把這個文檔送交給第三方,只要第三方知道該文檔的文檔類型定義(Document Type Definition ,DTD),那麼他就可以很容易的處理文檔了。你也可以呼叫writeDocument(Document doc,OutputStream osOut)方法來儲存這個文件。程式碼清單D就給一個把XML文件儲存到一個文件中的例子。
用XSLT轉換來查看資料
你也可以把XML資料轉換成其它格式,並用不同的視圖來表示其內容。最簡單的方法就是使用XSLT轉換,它提供了一種強大的面向樹的轉換語言實現,可以把使用一種詞彙表的XML實例轉換成簡單文本、HTML或者使用其它詞彙表的XML。
對給定的XML輸入,你可以用XSLT語言來建立你所期望的輸出。例如,透過執行transformData(InputStream xmlIn,InputStream xslIn,OutputStream transfOut),你就可以把XML資料轉換成一個HTML文件。程式碼清單E提供了XSLT轉換的一個例子,而清單F給出了通訊錄條目的HTML視圖。
簡化資料的管理
在本文中,我們透過分析PlainTextToXmlFormatter類別而學會如何把常用格式資料轉換成XML文件。我們也看到如何借助於XSLT轉換而以不同的視圖來表示XML文件。當你需要處理各種格式的數據時,採納上述技術或許就是一個好的解決方案,從而節省了你的寶貴時間並減少了出錯的可能性。
以上就是詳細介紹把資料轉換成XML格式的好處的內容,更多相關內容請關注PHP中文網(www.php.cn)!