軟件開發中常常要和第三方應用交互數據,特別是在銀行、電信行業,這種需求更是必不可少,每每一個系統要和三五個其它系統交互數據,而數據交換的報文常常採用Xml格式。 Xml結構嚴謹,利於人的閱讀,但格式較複雜,用代碼解析和拼裝有些繁瑣。不管是把Xml轉化成內存中的實體類對象,仍是把實體類對象序列化爲XML,都是個力氣活,並且耗費時間。 還好,問題老是有解決的辦法,這裏向你們介紹一款在線代碼生成器:XmlFactary。若是你有現成的Xml文檔,那麼大部分狀況下你不須要手工寫代碼來處理Xml與實體對象間的轉換。html

     XmlFactary這款代碼生成器,經過分析給定的Xml文本,稱之爲樣本Xml,將元素映射爲實體類,經過彙總每個元素的所有子屬性(Attribute),子元素(Element),及文本值(value),來造成實體類的屬性。名稱相同的元素,將映射爲一個實體類。 下面用實例簡介一下大體的用法,拋磚引玉一下。函數

     第一步就是先準備一個XML文檔,想來想去就用你們都比較熟悉的RSS格式吧。用代碼生成器分析下面的Xml文檔後,將默認生成三個類:Rss,Channel,Item,這三個類分別表明XML元素:<rss> <channel> <item>。post

複製代碼
<rss version="2.0">
  <channel>
    <title>參考消息電子版</title>
    <link>http://www.ckxx.info/</link>

    <item>
      <guid>http://www.ckxx.info/other1/201111/7-55584.html</guid>
      <title>伊朗核問題臨近最後攤牌</title>
      <description>伊朗核問題臨近最後攤牌</description>
      <link>http://www.ckxx.info/other1/201111/7-55584.html</link>
      <pubDate>2011-11-07</pubDate>
    </item>
    <item>
      <guid>http://www.ckxx.info/other1/201111/7-55583.html</guid>
      <title>日本天皇因病住院</title>
      <author>http://www.ckxx.info</author>
      <description>日本天皇因病住院</description>
      <link>http://www.ckxx.info/other1/201111/7-55583.html</link>
    </item>
  </channel>
</rss>
複製代碼

    我喜歡目標驅動的學習方式,在學習一項技術前,最好先知道這個技術的應用結果以及能帶來什麼幫助,因此我先不講如何作,而是先把作完的結果展現給你們。學習

    這裏:http://www.codingfactory.net/Page/XmlFactory/OutPut/XmlCSharp.aspx?id=8908 是根據以上XML生成的所有代碼,你們最好先了解一下代碼內容,再看下面的具體操做方法不遲。測試

    另外,這款代碼生成器功能較靈活,每個步驟都有很多可配置項, 本文並不一一展開,由於過於瑣碎的細節會影響咱們對主流程的理解。 有關代碼生成器的詳細說明,可參考官方幫助文檔,有興趣的朋友可自行了解。字體

    幫助:http://www.codingfactory.net/Page/XmlFactory/homepage/index.htmui

 

操做

1.打開這個網址(是個flash文件,400多k,有點大要稍等一下子):http://www.codingfactory.net/Page/XmlFactory/client/XmlFactory_Flex.html 把上面的Xml粘到樣本Xml中。url

 

 2.點右上方的 NEXT 銨鈕,頁面跳轉到 元素/子值 頁籤。該頁面將按元素名稱彙總顯示每一元素的子值,你能夠在此調整Xml文檔的元素結構。spa

    左側 元素列表 顯示全部XML元素(Element),右側 子值列表 顯示選中元素下的全部子值。 注意<channel>元素下有2個<item>子元素,因此,它的 多個 列中是被勾選中的,生成代碼時,這一項會被映射爲List<T>形式的類屬性。 固然你也能夠把title,link前面的勾打上,這樣生成代碼時,這兩項也會變成List形式。.net

    子值列表中 多個 列是藍色字體的列頭,藍色字體表示該列能夠編輯。你還能夠經過 添加子值刪除子值 等功能來調整Xml元素的子值結構;若是某個元素,你根本不須要,直接點 刪除元素 就成了。對於本例,咱們在這一頁不用作任何改動。

 

3.再點擊 NEXT 跳轉到 類名稱 頁面。該頁面中,你能夠爲Xml元素指定實體類名稱,表示你要把元素映射爲這個名稱的類。

    注意:不是全部的Xml元素都要映射爲實體類。好比本例中的<title>,<link>元素,它們只包含一個子值:[value], 固然不必爲這種元素定義實體類,由於基本數據類型(int,bool,string……)就能夠描述這個元素的值了。 因此,類名稱 那一列空着什麼都不填就成了,表示不將這個元素映射爲類。

 這個頁籤中三個列表的字段徹底一致,區別在於:

    a.最上方列表中,每個元素都必須映射爲類,也就是說 類名稱 那一列中必須填一個合法的類名。

    b.最下方列表中全部元素都只含有一個子值,這種元素不必映射成類,由於基本數據類型(int,double,string,datetime)就能夠表明其內容。因此 類名稱 那列應該空着。

    c.中間列表中的元素建議映射爲類。你在 類名稱 中填入類名,這個元素就映射爲類;空着的話,這個元素將被脫殼(脫殼的概念有些複雜,詳細說明請參考官方幫助文檔)。

    這部分有些複雜,不過不要緊,對於咱們的例子而言,這一頁什麼都不用作,由於通常狀況下默認設置就十分合理,你直接點 NEXT 就成了。

 

4.點擊 NEXT 跳轉到 類屬性 頁面。這一頁你要爲Xml元素的子值指定對應的屬性名稱和數據類型。

    代碼生成器根據樣本Xml中的內容,提供默認的數據類型,若是與你的實際需求不符,你能夠展開 數據類型 列的下拉列表,從中選擇你須要的基本數據類型。 對於已經映射爲類的子值,則不可變動其數據類型。例如:本例中元素<item>,已經映射爲類Item,因此類Channel的屬性Items,必須是Item類型的,不可變動。 點擊 屬性名稱 列的"item"單元格手工變爲Items,表示生成的實體類Channel中有一個List<Item> Items 屬性。

 

5.點擊 NEXT 跳轉到 預覽 頁面。到了這個頁面,你已能看到生成的實體類定義了。若是發現和預期的有所出入,能夠點擊以前的頁籤,從新進行配製。

預覽頁面有幾個可配置項,分別說一下:

貧血模式 生成的實體類中,只包含屬性。實體類與Xml的轉換函數在其它類中實現(「轉換類名稱」中指定的類)
充血模式 生成的實體類中,不只包含屬性,還包含實體類與Xml的轉換函數
包/命名空間 實體類所屬的命名空間
轉換類名稱 若是採用貧血模式,實體類與Xml的轉換函數將實如今此處指定的類中。

 

6.保留默認配置,最後一次點 NEXT ,彈出 生成代碼 頁面。這個頁面你們以前已經看過了,它包含三部分代碼:

EntityDefine 實體類定義,若是爲充血模式則還包含轉換函數。
AssistFunction 包含二個輔助函數:LoadFromFile  SaveToFile。你們看一下調用方式,就知道成生的代碼如何使用了。
Xml Entity Convert 實體對象與Xml轉換函數(僅在貧血模式下才有內容)

  

小結

好了,終於寫完了。總結一下大致流程就這幾步:

1. 樣本Xml頁籤中錄入用於分析的Xml

2. 元素/子值頁籤用於調整配置Xml結構

3. 類名稱頁籤用於指定類名稱

4. 類屬性頁籤用於指定類屬性

5. 預覽頁籤用於配置代碼生成項

 

最後,說說不足:

1.生成的代碼是基於Dom模型,不利於處理大文件(但多大算大呢?那得看硬件水平了,呵呵)

2.目前是測試版,功能上有限制,樣本Xml大小限於2K,一次最多生成6個類