鍍金池/ 教程/ C++/ 使用 XMLProperty
使用主從代碼模板
CodeTemplateInfo 對(duì)象
引用其它文件或 .Net 類庫(kù)
編寫第一個(gè)代碼模板
Progress 對(duì)象
基本語(yǔ)法-使用注釋
基本語(yǔ)法-轉(zhuǎn)義Asp.Net標(biāo)記
調(diào)試
為 Yii Framework 創(chuàng)建生成 ActiveRecord 的代碼模板
基本語(yǔ)法-聲明和使用屬性
自動(dòng)生成Yii Framework ActiveRecord類簡(jiǎn)單模板
Merge 策略
使用 XMLProperty
CodeTemplate 對(duì)象
基本語(yǔ)法-CodeTemplate 指令
概述
使用 SchemaExplorer 來(lái)獲取數(shù)據(jù)庫(kù)定義

使用 XMLProperty

在前面 CodeSmith 使用教程(6): 基本語(yǔ)法-聲明和使用屬性介紹了 CodeSmith 中使用屬性的基本方法,模板中的屬性是通過(guò) Property 指令來(lái)定義。

CodeSmith 也支持使用 XML 文檔來(lái)定義屬性,可以把一些配置屬性定義到 XML 文件中,定義 XML 的屬性是使用 XmlProperty 來(lái)定義:

<%@ XmlProperty Name="PurchaseOrder"
   Schema="PO.xsd"
   Optional="False"
   Category="Data"
   Description="Purchase Order to generate packing list for." %>

XmlProperty 指令可以有多個(gè)參數(shù),除 Name 為必須的外,其它的參考都是可選的。

屬性參數(shù)的介紹:

  • Name:模版使用的參數(shù)的名稱,必須為有效的模板語(yǔ)言名稱,比如使用 C#,Name 必須為有效的 C#變量名。但提供 XML 的 Schema 文件時(shí),這個(gè)變量的類型為一個(gè) XmlDocument 實(shí)例。
  • Schema:XML 屬性對(duì)應(yīng)的 Schema 文件名,可以用來(lái)校驗(yàn)存放 XML 屬性的 XML 文件是否有效,如果提供了 Schema 文件,CodeSmith 在代碼模板中支持 IntelliSense。
  • Default:設(shè)置默認(rèn)值。
  • Category:用來(lái)說(shuō)明這個(gè)屬性在 CodeSmith Explorer 的屬性面板中顯示成什么類型,例如下拉選擇、直接輸入等。
  • Description:在屬性面板中對(duì)于這個(gè)屬性的描述。
  • Optional:設(shè)置這個(gè)屬性是否是必須的,設(shè)置為 True 表明這個(gè)參數(shù)值可有可無(wú),設(shè)置為 False 則這個(gè)參數(shù)必須有值。
  • OnChanged 為屬性發(fā)生變化時(shí)定義事件處理代碼。
  • RootElement: 指定 XML 根元素的相對(duì)路徑。

本例使用 CodeSmith 自帶的一個(gè)例子,使用 PurchaseOrder.xsd ,XML 的定義如下:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://www.codesmithtools.com/purchaseorder"
elementFormDefault="qualified"
xmlns="http://www.codesmithtools.com/purchaseorder"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="PurchaseOrder">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="OrderDate" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="SubTotal" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="ShipCost" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="TotalCost" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="ShipTo" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Line1" type="xs:string" minOccurs="0" maxOccurs="1" />
              <xs:element name="City" type="xs:string" minOccurs="0" maxOccurs="1" />
              <xs:element name="State" type="xs:string" minOccurs="0" maxOccurs="1" />
              <xs:element name="Zip" type="xs:string" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
            <xs:attribute name="Name" type="xs:string" />
          </xs:complexType>
        </xs:element>
        <xs:element name="Items" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="OrderedItem" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="ItemName" type="xs:string" minOccurs="1" maxOccurs="1" />
                    <xs:element name="Description" type="xs:string" minOccurs="0" maxOccurs="1" />
                    <xs:element name="UnitPrice" type="xs:string" minOccurs="1" maxOccurs="1" />
                    <xs:element name="Quantity" type="xs:string" minOccurs="1" maxOccurs="1" />
                    <xs:element name="LineTotal" type="xs:string" minOccurs="1" maxOccurs="1" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

與這個(gè) XML Schema 配合使用的用來(lái)存放 XML 屬性的 XML 文件為 SamplePurchaseOrder.xml ,其定義如下:

<?xml version="1.0"?>
<PurchaseOrder xmlns="http://www.codesmithtools.com/purchaseorder">
  <ShipTo Name="Eric J. Smith">
    <Line1>123 Test Dr.</Line1>
    <City>Dallas</City>
    <State>TX</State>
    <Zip>75075</Zip>
  </ShipTo>
  <OrderDate>05-01-2003</OrderDate>
  <Items>
    <OrderedItem>
      <ItemName>Item #1</ItemName>
      <Description>Item #1 Description</Description>
      <UnitPrice>5.45</UnitPrice>
      <Quantity>3</Quantity>
      <LineTotal>16.35</LineTotal>
    </OrderedItem>
    <OrderedItem>
      <ItemName>Item #2</ItemName>
      <Description>Item #2 Description</Description>
      <UnitPrice>12.75</UnitPrice>
      <Quantity>8</Quantity>
      <LineTotal>102.00</LineTotal>
    </OrderedItem>
  </Items>
  <SubTotal>45.23</SubTotal>
  <ShipCost>5.23</ShipCost>
  <TotalCost>50.46</TotalCost>
</PurchaseOrder>

定義一個(gè)簡(jiǎn)單的模板,把 SamplePurchaseOrder.xml 中的內(nèi)容重新輸出,可以在代碼模板中定義一個(gè)XMLProperty ,其 Schema 指定為 PurchaseOrder.xsd

<%--
This template demonstates using the XmlProperty directive
--%>
<%@ CodeTemplate Language="C#" TargetLanguage="Text"
  Description="Demonstrates using the Xml serializer." %>
<%@ XmlProperty
   Name="MyPurchaseOrder"
   Schema="PurchaseOrder.xsd"
   Default="SamplePurchaseOrder.xml" %>
This file generated by CodeSmith on <%= DateTime.Now.ToLongDateString() %>

PurchaseOrder:
    Address:
        Name: <%= MyPurchaseOrder.ShipTo.Name %>
        Line1: <%= MyPurchaseOrder.ShipTo.Line1 %>
        City: <%= MyPurchaseOrder.ShipTo.City %>
        State: <%= MyPurchaseOrder.ShipTo.State %>
        Zip: <%= MyPurchaseOrder.ShipTo.Zip %>
    OrderDate: <%= MyPurchaseOrder.OrderDate %>
    Items:
        <% for (int i = 0; i < MyPurchaseOrder.Items.Count; i++) { %>
        <%= i %>:
            ItemName: <%= MyPurchaseOrder.Items[i].ItemName %>
            Description: <%= MyPurchaseOrder.Items[i].Description %>
            UnitPrice: <%= MyPurchaseOrder.Items[i].UnitPrice %>
            Quantity: <%= MyPurchaseOrder.Items[i].Quantity %>
            LineTotal: <%= MyPurchaseOrder.Items[i].LineTotal %>
        <% } %>
    SubTotal: <%= MyPurchaseOrder.SubTotal %>
    ShipCost: <%= MyPurchaseOrder.ShipCost %>
    TotalCost: <%= MyPurchaseOrder.TotalCost %>

模板中定義的 XML 屬性名為 MyPurchaseOrder 對(duì)應(yīng)的 Schema 為 PurchaseOrder.xsd ,因此在代碼模板可以通過(guò) MyPurchaseOrder.ShipTo.Name 的格式來(lái)直接引用 XML Schema 中定義的元素,CoddSmith 也支持 IntelliSense。

運(yùn)行該模板,首先需要為 MyPurchaseOrder 選擇合適的 XML 文件:

http://wiki.jikexueyuan.com/project/codesmith/images/32.png" alt="第32張" />

如果選擇的文件不符合指定的 XML Schema,CodeSmith 不允許選擇該文件,本例使用預(yù)先定義的SamplePurchaseOrder.xml ,生成的文件如下:

This file generated by CodeSmith on Saturday, 12 January 2013

PurchaseOrder:
    Address:
        Name: Eric J. Smith
        Line1: 123 Test Dr.
        City: Dallas
        State: TX
        Zip: 75075
    OrderDate: 05-01-2003
    Items:
        0:
            ItemName: Item #1
            Description: Item #1 Description
            UnitPrice: 5.45
            Quantity: 3
            LineTotal: 16.35
        1:
            ItemName: Item #2
            Description: Item #2 Description
            UnitPrice: 12.75
            Quantity: 8
            LineTotal: 102.00
    SubTotal: 45.23
    ShipCost: 5.23
    TotalCost: 50.46

本例下載