2012-09-20 123 views
0

這不是一個特定的編程問題,而是一個請求來了解執行某些操作的正確方法。使用提供的xsd文件進行XML驗證

「The Something」:我的代碼執行用戶提供的發佈XML作爲標準輸出的PowerShell腳本。這個輸出應該遵循我們作爲軟件安裝程序一部分發布和交付的模式。我們支持輸出版本,所以客戶的XML都會有這樣的一個版本2的輸出在它們的XML根:

<my_report version="2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mycompany.com/permanent/config-2.0.xsd config-2.0.xsd"> 

客戶輸出XML可能不是有效的XML(因此進行驗證需求在我們消耗之前)。

我的目標是獲取版本屬性的值並確保它與提供的正確的.xsd文件名匹配,然後使用該.xsd文件驗證輸出XML。

由於輸出XML可能不是有效的,我不能依賴像XElement.Parse()這樣的東西來獲取XML到一個變量中來操作它。所以,我覺得我唯一的辦法是解析第一個元素(my_report)並使用字符串操作來做出決定。

注意:代碼運行的機器不保證能夠訪問互聯網。

我的基本問題:這是否理智?我是否在野草中做這樣的事情?如果思維不清晰,那麼什麼是好的選擇?

平臺是Windows Server 2008 R2,C#4.0控制檯應用程序類型。

回答

0

通常爲版本控制Xml文檔使用命名空間。在這種方法中,每個版本都有自己的命名空間和自己的Xsd。要驗證一個Xml文檔,您可以將所有Xsd文檔加載到一個模式集並驗證xml。這遠非理想(增加了很多複雜性,即使文檔只是不同的版本,它們在語義上完全不相關,而通常更新的版本基於先前的版本等),但我認爲它仍然是最常見的事情。如果您只是將驗證改進爲已經使用xml文檔而沒有名稱空間的現有系統進行版本控制,則採用上述方法將意味着您的應用程序發生了很多變化(更不用說發送xml文件的客戶所做的更改)。要發現您可以首先使用的版本,只需使用XmlReader - 您將移至根元素,並檢查名稱是否符合您的期望,並且版本屬性(或僅作爲模式的版本應拒絕具有意外的根元素的文檔)。然後你會拋出你創建的XmlReader實例,並創建一個新的驗證(並可能加載文檔)。這應該很便宜,因爲您實際上沒有閱讀整個文檔以發現版本,而只是根元素,並且如果文檔不是有效的Xml文檔(例如沒有根節點等),則XmlReader將檢測該文檔並扔。