尹輯山,曹三省
(中國傳媒大學(xué),北京100024)
新聞行業(yè)如果沒有統(tǒng)一的中文新聞技術(shù)標(biāo)準(zhǔn),往往容易造成新聞共享和資源利用的各種困難,即便在一個單位內(nèi)部的各個系統(tǒng)之間也會形成信息孤島,彼此之間數(shù)據(jù)交換需要進(jìn)行繁雜的格式轉(zhuǎn)換,增加了開發(fā)和維護(hù)的成本。中文新聞信息置標(biāo)語言(CNML)的制定結(jié)束了國內(nèi)新聞行業(yè)內(nèi)長期沒有統(tǒng)一標(biāo)準(zhǔn)的局面。該標(biāo)準(zhǔn)不僅能夠很好的適應(yīng)新聞行業(yè)的數(shù)字化、網(wǎng)絡(luò)化及多媒體化,并且為新聞領(lǐng)域多媒體發(fā)信息的組織、發(fā)布、交換、存儲、應(yīng)用建立一套非常完整的新聞數(shù)據(jù)、元數(shù)據(jù)、受控詞表等相關(guān)技術(shù),而且方便新聞媒體單位之間及單位內(nèi)部各個系統(tǒng)之間的新聞信息的交流和共享[1]。
目前國際上的新聞標(biāo)準(zhǔn)有多種,如國際電訊理事會(IPTV)的 NewsML1.x、NITF、NewsCode、新華社的XinHuaML、國際數(shù)字企業(yè)聯(lián)盟的Prism、ISO/IEC的Mpeg7,都柏林核心元數(shù)據(jù)(Dublin Core),國家廣播電影電視總局的音頻、視頻編目標(biāo)準(zhǔn)等等[2]。其中,最具有重要影響力的是IPTV的NewsML1.x,目前是NewsML1.2版本。NewsML核心是定義了一種一對多的基本結(jié)構(gòu),它為新聞數(shù)據(jù)的互換和管理提供了框架。
CNML新聞標(biāo)準(zhǔn)與NewsML標(biāo)準(zhǔn)相比較,CNML新聞標(biāo)準(zhǔn)在元數(shù)據(jù)管理機(jī)制和新聞數(shù)據(jù)的格式上更有優(yōu)勢,一方面,它規(guī)定了新聞流通領(lǐng)域內(nèi)的企業(yè)型用戶可以針對自己的業(yè)務(wù)特點提供相應(yīng)的元數(shù)據(jù)擴(kuò)展機(jī)制;另一方面,它將新聞數(shù)據(jù)層和語義層分離開來,便于新聞數(shù)據(jù)的管理和挖掘。
CNML新聞標(biāo)準(zhǔn)不僅在新聞數(shù)據(jù)的交換方面提供了統(tǒng)一的新聞元數(shù)據(jù)標(biāo)準(zhǔn)和規(guī)范的交換格式,而且還能夠充分滿足媒體前瞻性的要求,對所交換的數(shù)據(jù)提供更多語義層面的支持,提供稿件之間和內(nèi)容項之間豐富的關(guān)聯(lián)關(guān)系。
首先,CNML標(biāo)準(zhǔn)依托于XML技術(shù),XML是可擴(kuò)展標(biāo)記語言 (Extensible Markup Language)的縮寫,用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,能夠允許用戶自己定義的標(biāo)簽來進(jìn)行標(biāo)識的語言。XML是標(biāo)準(zhǔn)通用標(biāo)記語言(SGML)的子集,能夠很好的被應(yīng)用到系統(tǒng)之間進(jìn)行數(shù)據(jù)交換。目前,XML語言已經(jīng)成為信息交換的通用語言。因此,CNML標(biāo)準(zhǔn)具有先天的優(yōu)越性。該標(biāo)準(zhǔn)中為新聞領(lǐng)域多媒體信息的組織、發(fā)布、交換、存儲及應(yīng)用定義了一套非常完整的新聞數(shù)據(jù)、元數(shù)據(jù)、受控詞表等相關(guān)技術(shù)標(biāo)準(zhǔn),使得新聞文檔更加規(guī)范化、標(biāo)準(zhǔn)化。不同系統(tǒng)之間或系統(tǒng)內(nèi)部之間進(jìn)行信息交換就可以大大簡化了數(shù)據(jù)交換的過程,避免了不同標(biāo)準(zhǔn)之間的相互轉(zhuǎn)換及完整性驗證等處理步驟。
其次,從CNML標(biāo)準(zhǔn)的結(jié)構(gòu)方面來看,該標(biāo)準(zhǔn)將一篇完整的CNML新聞文檔分成三個層:文檔層、稿件層和內(nèi)容層。文檔層包含了用于信息交換的信封(envolope)和稿件;稿件層包括元數(shù)據(jù)組、多媒體內(nèi)容及稿件關(guān)系;內(nèi)容層包含內(nèi)容元數(shù)據(jù)組、數(shù)據(jù)內(nèi)容及內(nèi)容關(guān)系。另外,稿件還定義了關(guān)系描述和受控詞表及引用機(jī)制。從CNML標(biāo)準(zhǔn)的各個層次中可以發(fā)現(xiàn),層次之間是一種包含關(guān)系[1]。具體結(jié)構(gòu)如圖1所示:
圖1 CNML標(biāo)準(zhǔn)層次結(jié)構(gòu)模型圖
另外,在統(tǒng)一層中,各個模塊是相對獨立的。比如,在稿件層,元數(shù)據(jù)組、多媒體內(nèi)容以及稿件關(guān)系都是相互分離的表示的,這種設(shè)計使得標(biāo)準(zhǔn)結(jié)構(gòu)更加清晰,便于準(zhǔn)確獲取對應(yīng)部分內(nèi)容。而且在元數(shù)據(jù)組、多媒體內(nèi)容、以及稿件關(guān)系的內(nèi)部設(shè)計也都是繼承了它們上一級層次的設(shè)計模式,各個模塊彼此相對獨立,對各部分?jǐn)?shù)據(jù)的管理也就更加方便了。這種各個模塊相對獨立的設(shè)計方案,很類似面向?qū)ο笳Z言的設(shè)計。每個模塊都是一個對象,所有的模塊都繼承了CNML文檔這個最原始的對象,所有的模塊都是它的子孫模塊。不僅如此,CNML標(biāo)準(zhǔn)也提供了擴(kuò)展機(jī)制,能夠適應(yīng)未來可能出現(xiàn)的新的數(shù)據(jù)交換新需求。該擴(kuò)展機(jī)制同樣非常類似面向?qū)ο笳Z言中的繼承關(guān)系。因此,在對CNML新聞標(biāo)準(zhǔn)文檔進(jìn)行處理的時候,可以將其映射成許多相對獨立但彼此又有關(guān)聯(lián)的對象。標(biāo)準(zhǔn)中的稿件級關(guān)系和內(nèi)容項級關(guān)系在對數(shù)據(jù)進(jìn)行關(guān)系型數(shù)據(jù)庫存儲時將會非常有用。
本系統(tǒng)是采用B/S模式基于CNML新聞標(biāo)準(zhǔn)的能夠?qū)崿F(xiàn)新聞數(shù)據(jù)內(nèi)容的上傳、CNML標(biāo)準(zhǔn)文檔的生成以及新聞數(shù)據(jù)內(nèi)容的顯示等功能。
系統(tǒng)后臺使用Java編程語言針對不同媒體類型的新聞內(nèi)容,即對應(yīng)CNML標(biāo)準(zhǔn)中的不同類型的內(nèi)容項,開發(fā)了一系列的程序接口來實現(xiàn)新聞數(shù)據(jù)的上傳。根據(jù)CNML標(biāo)準(zhǔn)的結(jié)構(gòu)特點,我們采用了模版的方式來進(jìn)行CNML標(biāo)準(zhǔn)文檔的生成。比如,信封(envolope)、稿件關(guān)系、內(nèi)容項關(guān)系等內(nèi)容進(jìn)行模版化設(shè)計。當(dāng)進(jìn)行新聞內(nèi)容上傳時,首先創(chuàng)建一個空的XML文檔,然后讀取模版內(nèi)容,并寫入到空的XML文檔中。然后,將上傳的新聞數(shù)據(jù)通過Dom4j組件按照CNML標(biāo)準(zhǔn)來進(jìn)行封裝,并遍歷XML文檔,找到內(nèi)容層并將封裝的內(nèi)容項插入指定位置。
XML與數(shù)據(jù)庫都有存儲數(shù)據(jù)的能力,然而,數(shù)據(jù)庫提供了更強(qiáng)大的數(shù)據(jù)存儲和數(shù)據(jù)分析能力。如果系統(tǒng)存儲要求不高的話,可以采用XML直接存儲數(shù)據(jù),并采用XPath、Dom4j等技術(shù)來對其進(jìn)行解析。然而,這種方式對CNML文檔管理上也會存在一定麻煩,比如,文檔名的沖突問題,對文檔的內(nèi)容的修改和刪除。CNML標(biāo)準(zhǔn)中各個模塊相對獨立,并且各個層是包含關(guān)系,由此使用面向?qū)ο蟮脑O(shè)計方法,將各個模塊映射成一個個對象,在層次結(jié)構(gòu)中處于內(nèi)層的作為外層的屬性。通過JAXB數(shù)據(jù)綁定技術(shù),根據(jù)CNML實例文檔生成Java類。Java類中的屬性,對應(yīng)了CNML文檔中屬性和子標(biāo)簽[3]。然后通過ORM框架iBatis將對象和數(shù)據(jù)庫中的表格進(jìn)行關(guān)聯(lián)。
整個系統(tǒng)采用MVC模式,JAXB生成的Java類作為M(Model層)。C(Controller層)用來處理客戶端的請求,通過調(diào)用持久層類的業(yè)務(wù)方法進(jìn)行數(shù)據(jù)庫操作[4]。整體框架設(shè)計如圖2所示:
另外,系統(tǒng)中還設(shè)計了對新聞信息的有效管理設(shè)計。包括對稿件層和內(nèi)容項層內(nèi)容的增刪改查等操作。系統(tǒng)后臺設(shè)計效果圖如圖3所示:
系統(tǒng)前端主要通過Ajax技術(shù),從服務(wù)器端獲取新聞數(shù)據(jù),然后在瀏覽器中進(jìn)行呈現(xiàn)。通過Ajax異步通信技術(shù)可以有效減少通信所需的帶寬,而且對數(shù)據(jù)的處理主要放在客戶端瀏覽器來執(zhí)行,減輕了服務(wù)器端對數(shù)據(jù)處理的壓力。
在首頁中對服務(wù)器端發(fā)送請求給Controller層對象,Controller層對象調(diào)用Service層對象的方法按照時間從數(shù)據(jù)庫中查找較新的新聞標(biāo)題列表,并返回給客戶端。通過JavaScript開發(fā)框架jQuery在客戶端給每個新聞標(biāo)題來添加click事件,click觸發(fā)事件中調(diào)用 jQuery封裝的 Ajax方法$.getJSON(url,[data],[callback])。url地址設(shè)置成 Controller層對象,data參數(shù)中填寫要獲取數(shù)據(jù)的標(biāo)識信息。Controller層對象將會從數(shù)據(jù)庫中查找data參數(shù)中指定的數(shù)據(jù),封裝成.json格式的文件后返回給客戶端。callback參數(shù)指向的JavaScript方法,來完成對返回的.json格式的文件里數(shù)據(jù)進(jìn)行解析,并將數(shù)據(jù)添加到在html對應(yīng)標(biāo)簽中[5]。具體流程及效果如圖4、5所示:
圖4 系統(tǒng)前端設(shè)計流程圖
圖5 系統(tǒng)前端效果圖
在之前的系統(tǒng)版本設(shè)計中,我們未采用數(shù)據(jù)庫來進(jìn)行數(shù)據(jù)的存儲,而是將數(shù)據(jù)僅僅存儲在CNML標(biāo)準(zhǔn)文檔中,而且在系統(tǒng)前端的設(shè)計中是獲取一個完整的CNML標(biāo)準(zhǔn)新聞。這種設(shè)計一方面不符合MVC開發(fā)模式,不利于代碼的重復(fù)使用,各層之間密切耦合;另一方面,浪費了資源,一個完整的CNML標(biāo)準(zhǔn)文檔里有大量的元數(shù)據(jù)、新聞信息數(shù)據(jù),然而在新聞閱讀端我們僅僅需要的是一些核心的數(shù)據(jù)。在本次改進(jìn)版本設(shè)計中,采用了MVC的開發(fā)模式,使用jQuery框架對Ajax封裝一系列方法,采用Json格式來進(jìn)行通信,大大提高了通信效率節(jié)省了帶寬。
數(shù)據(jù)綁定是指將一些數(shù)據(jù)(XML文檔或者數(shù)據(jù)庫中),通過程序表示這些數(shù)據(jù)的過程。數(shù)據(jù)綁定API允許通過編程來操縱XML。
JAXB(Java Architecture for XML Binding)是一個業(yè)界的標(biāo)準(zhǔn),是一種能夠從XML或Schema生成Java類的技術(shù)。JAXB將XML文件解組成Java內(nèi)容對象樹。應(yīng)用程序可以直接訪問表示該數(shù)據(jù)內(nèi)容和結(jié)構(gòu)的Java對象。JAXB綁定編譯器將 XML Schema作為輸入,生成能夠反映Schema定義規(guī)則的Java接口和類的包,并將其進(jìn)行編譯組成一個公用的JAXB程序包,此過程成為解組(unmarshalling)。編組(marshalling)與解組的過程正好相反,根據(jù)Java內(nèi)容樹返回XML實例文檔的過程[6]。
使用JAXB進(jìn)行數(shù)據(jù)綁定,首先要引入開發(fā)所需要的jar包和環(huán)境變量JAXB_HOME、JAXB_LIBS的設(shè)置。JAXB_HOME變量用來指定JAXB的安裝目錄,JAXB_LIBS指定開發(fā)所需的jar包的位置。第二步,用 xjc.bat命令根據(jù) XML Schema生成JAXB Java類。如:
xjc.bat CNML_v2.020091106.xsd-p com.cuc
其中,CNML_v2.020091106.xsd是源 XML Schema的文件名;com.cuc是JAXB編譯器將生成的Java接口類存放的包名。然后,將所生成的類進(jìn)行編譯[7]。最后,通過編程的方式,來生成具體CNML標(biāo)準(zhǔn)的實例文件。如:
JAXBContext jaxbC=JAXBContext.newInstance(PACKAGE_NAME);
Unmarshaller unmarshaller = jaxbC.createUnmarshaller();
Object obj=unmarshaller.unmarshal(new FileInputStream(inputFilename));
首先創(chuàng)建一個JAXBContext的實例對象,并且指定生成的類存放的包名。然后,通過該對象創(chuàng)建一個解組對象unmarshaller,最后一步將根據(jù)CNML標(biāo)準(zhǔn)實例文檔來生成具體的java類實例對象[8]。
通過JAXB生成的java對象可以作為javabean來與數(shù)據(jù)庫中的表進(jìn)行映射。
Ajax是Asynchronous JavaScript and XML的縮寫,其核心是通過XMLHttpRequest對象以異步的方式,向服務(wù)器發(fā)送數(shù)據(jù)請求,并接受服務(wù)器返回的針對請求的數(shù)據(jù)。在2005年,Google通過其Google Suggest使Ajax逐漸變得廣泛應(yīng)用。Ajax并不是一種新的編程技術(shù),其在Web應(yīng)用方面能夠創(chuàng)建更好更快及交互性更強(qiáng)的特性。Ajax是一種獨立于服務(wù)器的技術(shù),其最大優(yōu)點是能夠在不更新整個頁面的前提下與服務(wù)器端進(jìn)行通信,從而節(jié)省了帶寬。
Ajax應(yīng)用時首先要實例化一個異步對象連接器。在實例化時要充分考慮不同瀏覽器兼容性問題,主要針對主流瀏覽器 IE和 FireFox。創(chuàng)建完XMLHttpRequest對象后,利用 open(method,url,asynchronous,usr,password)來建立一個請求,并使用send()向服務(wù)器發(fā)送請求。如果open()方法中的請求方式為“post”,則需要使用setRequestHeader()來添加HTTP頭。然后在send()方法中規(guī)定發(fā)送請求的參數(shù)數(shù)據(jù)。
XMLHttpRequest對象有兩個屬性responseText和responseXML。在CNML新聞標(biāo)準(zhǔn)應(yīng)用中,我們可以使用Ajax來從服務(wù)器端獲取XML格式的新聞文檔。responseXML屬性能夠獲取服務(wù)器端返回的以XML格式進(jìn)行組織的數(shù)據(jù)。然后在XMLHttpRequest對象的onreadystatechange事件屬性中,對獲取的CNML新聞文檔進(jìn)行處理,通過 JavaScript的DOM來進(jìn)行新聞數(shù)據(jù)的解析[9]。其詳細(xì)過程如圖6所示:
圖6 Ajax應(yīng)用流程
在JavaScript的jQuery框架中對Ajax進(jìn)行了很好的封裝,并且很好的解決了瀏覽器兼容問題。jQueyr中使用全局函數(shù)$.get(url,[data],[callback],[type])、$.post(url,[data],[callback],[type])方法來異步加載服務(wù)器端的CNML新聞文檔。url,表示等待加載的數(shù)據(jù)地址,可選參數(shù)data表示發(fā)送到服務(wù)器的數(shù)據(jù),其格式為key/value,可選項callback參數(shù)表示加載成功時的回調(diào)函數(shù)。可選參數(shù)type參數(shù)表示返回數(shù)據(jù)的格式,如HTML、XML、Js、Json、text等。在系統(tǒng)設(shè)計中,我們要獲取CNML標(biāo)準(zhǔn)新聞中的有效數(shù)據(jù),可以將type設(shè)置成“XML”,服務(wù)器端就可以從數(shù)據(jù)庫中獲取數(shù)據(jù)并用DOM4J組件的API將數(shù)據(jù)組織成XML文檔格式,并返回給客戶端。
在不同應(yīng)用系統(tǒng)之間或應(yīng)用系統(tǒng)內(nèi)部之間進(jìn)行數(shù)據(jù)交換,XML數(shù)據(jù)格式無疑是首選,在一些Web應(yīng)用中可以通過Json格式進(jìn)異步獲取數(shù)據(jù)從而提高通信效率。當(dāng)要對新聞數(shù)據(jù)格式進(jìn)行解析時,XML數(shù)據(jù)格式和Json數(shù)據(jù)格式相比較就顯的會有些冗余,因為XML數(shù)據(jù)格式中需要每個標(biāo)簽都要關(guān)閉,這樣就會造成一定程度上的資源浪費。Json是另一種輕量級的數(shù)據(jù)交互方式。jQuery同樣對采用Ajax技術(shù)來從服務(wù)器獲取Json格式數(shù)據(jù)的方法進(jìn)行了很好的封裝,$.getJSON(url,[data],[callback])。在可選參數(shù)data可以用來指定想要獲取CNML新聞標(biāo)準(zhǔn)信息中具體部分或指定位置的數(shù)據(jù)內(nèi)容。服務(wù)器端將根據(jù)請求參數(shù)從數(shù)據(jù)庫中獲取數(shù)據(jù)并生成.json格式的文件[5]。.json格式文件內(nèi)容如下所示:
[{“Headline”:”中國人劉翔創(chuàng)造歷史—男子110米欄記錄歷史回顧”,
“FullName”:“張曉明”,
“DataContent”:“中國選手劉翔成為2006年瑞士洛桑田徑超級大獎賽的超級明星,圖為接受各國記者采訪”,
…
}]
callback參數(shù)是對獲取到的.json文件進(jìn)行解析的回調(diào)函數(shù),并將對應(yīng)數(shù)據(jù)顯示到html標(biāo)簽中。由此可見,.json格式文件與XML格式文件相比,對資源信息的描述更加精簡,有效減少通信數(shù)據(jù)的冗余。
本文首先對中文新聞信息置標(biāo)語言進(jìn)行了研究,通過與國際標(biāo)準(zhǔn)進(jìn)行比較體現(xiàn)了它在一些設(shè)計上的優(yōu)越性。并且基于該標(biāo)準(zhǔn)設(shè)計了一套應(yīng)用系統(tǒng),能夠?qū)崿F(xiàn)新聞數(shù)據(jù)的采集和信息發(fā)布。客戶端能夠通過瀏覽器進(jìn)行新聞的閱讀。整個系統(tǒng)在原來版本的基礎(chǔ)上又采用了MVC的開發(fā)模式,使用JAXB開發(fā)組件,將CNML標(biāo)準(zhǔn)文檔映射出相應(yīng)Java類,充當(dāng)Model層組件,并且與關(guān)系型數(shù)據(jù)庫進(jìn)行映射。在新聞數(shù)據(jù)解析時,采用了Web2.0的Ajax技術(shù),Ajax的異步通信可以有效節(jié)省帶寬,并且使用輕量級的Json格式文件能夠進(jìn)一步節(jié)省資源。
[1] 陳明祥.中文新聞信息置標(biāo)語言使用指南[M].北京:新華出版社,2008.
[2] 武國衛(wèi),刁毅剛,黃菁.中文新聞信息置標(biāo)語言之創(chuàng)新研究[J].中國傳媒科技.2005.11
[3] 楚昌林.XML到關(guān)系數(shù)據(jù)庫轉(zhuǎn)換研究[J].微型機(jī)與應(yīng)用,2009.11
[4] 趙俊峰.Java Web應(yīng)用開發(fā)案例教程——基于MVC模式的JSP+Servlet+JDBC和AJAX[M].北京:清華大學(xué)出版社,2012.
[5] 陶國榮.jQuery權(quán)威指南[M].北京:機(jī)械工業(yè)出版社,2011.
[6] 王岳昭,冒東奎.Java綁定XML架構(gòu)的技術(shù)內(nèi)涵[J].北京工業(yè)大學(xué)學(xué)報,2006,3(32).
[7] Brett McLaughlin.Practical data binding:Get your feet wet in the real world[DB/OL].http://www.ibm.com/developerworks/library/x-pracdb1/index.html#.
[8] Brett McLaugblin.Java &XML,SecondEdition[M].O’Reilly& Associates,2004.
[9] 馬勞可林.深入淺出Ajax[M].南京:東南大學(xué)出版社,2008.