CodeSmith 使用教程(16) 使用XMLProperty分析

虾米哥 阅读:252 2021-04-01 00:27:15 评论:0


在前面CodeSmith 使用教程(6): 基本语法-声明和使用属性 介绍了CodeSmith中使用属性的基本方法,模板中的属性是通过Property指令来定义。

CodeSmith 也支持使用XML文档来定义属性,可以把一些配置属性定义到XML文件中,定义XML的属性是使用XmlProperty来定义:

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

XmlProperty 指令可以有多个参数,除Name为必须的外,其它的参考都是可选的。

属性参数的介绍:

  • Name:模版使用的参数的名称,必须为有效的模板语言名称,比如使用C#,Name必须为有效的C#变量名。但提供XML 的Schema文件时,这个变量的类型为一个XmlDocument实例。
  • Schema:XML属性对应的Schema文件名,可以用来校验存放XML属性的XML文件是否有效,如果提供了Schema 文件,CodeSmith在代码模板中支持IntelliSense。
  • Default:设置默认值。
  • Category:用来说明这个属性在CodeSmith Explorer的属性面板中显示成什么类型,例如下拉选择、直接输入等。
  • Description:在属性面板中对于这个属性的描述。
  • Optional:设置这个属性是否是必须的,设置为True表明这个参数值可有可无,设置为False则这个参数必须有值。
  • OnChanged 为属性发生变化时定义事件处理代码。
  • RootElement: 指定XML根元素的相对路径。

本例使用CodeSmith自带的一个例子,使用PurchaseOrder.xsd ,XML 的定义如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <xs:schema targetNamespace="http://www.codesmithtools.com/purchaseorder"  
  3. elementFormDefault="qualified"  
  4. xmlns="http://www.codesmithtools.com/purchaseorder"  
  5. xmlns:xs="http://www.w3.org/2001/XMLSchema">  
  6.   <xs:element name="PurchaseOrder">  
  7.     <xs:complexType>  
  8.       <xs:sequence>  
  9.         <xs:element name="OrderDate" type="xs:string" minOccurs="1" maxOccurs="1" />  
  10.         <xs:element name="SubTotal" type="xs:string" minOccurs="1" maxOccurs="1" />  
  11.         <xs:element name="ShipCost" type="xs:string" minOccurs="0" maxOccurs="1" />  
  12.         <xs:element name="TotalCost" type="xs:string" minOccurs="1" maxOccurs="1" />  
  13.         <xs:element name="ShipTo" minOccurs="0" maxOccurs="1">  
  14.           <xs:complexType>  
  15.             <xs:sequence>  
  16.               <xs:element name="Line1" type="xs:string" minOccurs="0" maxOccurs="1" />  
  17.               <xs:element name="City" type="xs:string" minOccurs="0" maxOccurs="1" />  
  18.               <xs:element name="State" type="xs:string" minOccurs="0" maxOccurs="1" />  
  19.               <xs:element name="Zip" type="xs:string" minOccurs="0" maxOccurs="1" />  
  20.             </xs:sequence>  
  21.             <xs:attribute name="Name" type="xs:string" />  
  22.           </xs:complexType>  
  23.         </xs:element>  
  24.         <xs:element name="Items" minOccurs="0" maxOccurs="1">  
  25.           <xs:complexType>  
  26.             <xs:sequence>  
  27.               <xs:element name="OrderedItem" minOccurs="0" maxOccurs="unbounded">  
  28.                 <xs:complexType>  
  29.                   <xs:sequence>  
  30.                     <xs:element name="ItemName" type="xs:string" minOccurs="1" maxOccurs="1" />  
  31.                     <xs:element name="Description" type="xs:string" minOccurs="0" maxOccurs="1" />  
  32.                     <xs:element name="UnitPrice" type="xs:string" minOccurs="1" maxOccurs="1" />  
  33.                     <xs:element name="Quantity" type="xs:string" minOccurs="1" maxOccurs="1" />  
  34.                     <xs:element name="LineTotal" type="xs:string" minOccurs="1" maxOccurs="1" />  
  35.                   </xs:sequence>  
  36.                 </xs:complexType>  
  37.               </xs:element>  
  38.             </xs:sequence>  
  39.           </xs:complexType>  
  40.         </xs:element>  
  41.       </xs:sequence>  
  42.     </xs:complexType>  
  43.   </xs:element>  
  44. </xs:schema>  
<?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> 
与这个XML Schema配合使用的用来存放XML属性的XML文件为SamplePurchaseOrder.xml ,其定义如下:

  1. <?xml version="1.0"?>  
  2. <PurchaseOrder xmlns="http://www.codesmithtools.com/purchaseorder">  
  3.   <ShipTo Name="Eric J. Smith">  
  4.     <Line1>123 Test Dr.</Line1>  
  5.     <City>Dallas</City>  
  6.     <State>TX</State>  
  7.     <Zip>75075</Zip>  
  8.   </ShipTo>  
  9.   <OrderDate>05-01-2003</OrderDate>  
  10.   <Items>  
  11.     <OrderedItem>  
  12.       <ItemName>Item #1</ItemName>  
  13.       <Description>Item #1 Description</Description>  
  14.       <UnitPrice>5.45</UnitPrice>  
  15.       <Quantity>3</Quantity>  
  16.       <LineTotal>16.35</LineTotal>  
  17.     </OrderedItem>  
  18.     <OrderedItem>  
  19.       <ItemName>Item #2</ItemName>  
  20.       <Description>Item #2 Description</Description>  
  21.       <UnitPrice>12.75</UnitPrice>  
  22.       <Quantity>8</Quantity>  
  23.       <LineTotal>102.00</LineTotal>  
  24.     </OrderedItem>  
  25.   </Items>  
  26.   <SubTotal>45.23</SubTotal>  
  27.   <ShipCost>5.23</ShipCost>  
  28.   <TotalCost>50.46</TotalCost>  
  29. </PurchaseOrder>  
<?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> 

定义一个简单的模板,把SamplePurchaseOrder.xml 中的内容重新输出,可以在代码模板中定义一个XMLProperty ,其Schema 指定为PurchaseOrder.xsd

  1. <%--  
  2. This template demonstates using the XmlProperty directive  
  3. --%>  
  4. <%@ CodeTemplate Language="C#" TargetLanguage="Text"  
  5.   Description="Demonstrates using the Xml serializer." %>  
  6. <%@ XmlProperty  
  7.    Name="MyPurchaseOrder"  
  8.    Schema="PurchaseOrder.xsd"  
  9.    Default="SamplePurchaseOrder.xml" %>  
  10. This file generated by CodeSmith on <%= DateTime.Now.ToLongDateString() %>  
  11.   
  12. PurchaseOrder:  
  13.     Address:  
  14.         Name: <%= MyPurchaseOrder.ShipTo.Name %>  
  15.         Line1: <%= MyPurchaseOrder.ShipTo.Line1 %>  
  16.         City: <%= MyPurchaseOrder.ShipTo.City %>  
  17.         State: <%= MyPurchaseOrder.ShipTo.State %>  
  18.         Zip: <%= MyPurchaseOrder.ShipTo.Zip %>  
  19.     OrderDate: <%= MyPurchaseOrder.OrderDate %>  
  20.     Items:  
  21.         <% for (int i = 0; i < MyPurchaseOrder.Items.Count; i++) { %>  
  22.         <%= i %>:  
  23.             ItemName: <%= MyPurchaseOrder.Items[i].ItemName %>  
  24.             Description: <%= MyPurchaseOrder.Items[i].Description %>  
  25.             UnitPrice: <%= MyPurchaseOrder.Items[i].UnitPrice %>  
  26.             Quantity: <%= MyPurchaseOrder.Items[i].Quantity %>  
  27.             LineTotal: <%= MyPurchaseOrder.Items[i].LineTotal %>  
  28.         <% } %>  
  29.     SubTotal: <%= MyPurchaseOrder.SubTotal %>  
  30.     ShipCost: <%= MyPurchaseOrder.ShipCost %>  
  31.     TotalCost: <%= MyPurchaseOrder.TotalCost %>  
<%-- 
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 对应的Schema为PurchaseOrder.xsd ,因此在代码模板可以通过MyPurchaseOrder.ShipTo.Name 的格式来直接引用XML Schema中定义的元素,CoddSmith也支持IntelliSense。
运行该模板,首先需要为MyPurchaseOrder选择合适的XML文件:
20130112001 如果选择的文件不符合指定的XML Schema,CodeSmith不允许选择该文件,本例使用预先定义的SamplePurchaseOrder.xml ,生成的文件如下:

  1. This file generated by CodeSmith on Saturday, 12 January 2013  
  2.   
  3. PurchaseOrder:  
  4.     Address:  
  5.         Name: Eric J. Smith  
  6.         Line1: 123 Test Dr.  
  7.         City: Dallas  
  8.         State: TX  
  9.         Zip: 75075  
  10.     OrderDate: 05-01-2003  
  11.     Items:  
  12.         0:  
  13.             ItemName: Item #1  
  14.             Description: Item #1 Description  
  15.             UnitPrice: 5.45  
  16.             Quantity: 3  
  17.             LineTotal: 16.35  
  18.         1:  
  19.             ItemName: Item #2  
  20.             Description: Item #2 Description  
  21.             UnitPrice: 12.75  
  22.             Quantity: 8  
  23.             LineTotal: 102.00  
  24.     SubTotal: 45.23  
  25.     ShipCost: 5.23  
  26.     TotalCost: 50.46  

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
KIKK导航

KIKK导航

排行榜
关注我们

一个IT知识分享的公众号