CodeSmith允许我们存储元数据在XML文件中,然后在执行模版时直接打开XML文件填写到属性面板中。


1.XML Property With a Schema


1CodeSmith实用技巧(六):使用XML 属性_xml文件<?xml version="1.0" encoding="UTF-8"?>

2CodeSmith实用技巧(六):使用XML 属性_模版_02<xs:schema targetNamespace=http://www.codesmithtools.com/PO

3CodeSmith实用技巧(六):使用XML 属性_xml_03 xmlns:xs=http://www.w3.org/2001/XMLSchema

4CodeSmith实用技巧(六):使用XML 属性_元数据_04 xmlns=http://www.codesmithtools.com/PO

5CodeSmith实用技巧(六):使用XML 属性_xml文件_05 elementFormDefault="qualified" attributeFormDefault="unqualified">

6CodeSmith实用技巧(六):使用XML 属性_模版_06 <xs:element name="PurchaseOrder">

7CodeSmith实用技巧(六):使用XML 属性_c#_07 <xs:complexType>

8CodeSmith实用技巧(六):使用XML 属性_模版_08 <xs:sequence>

9CodeSmith实用技巧(六):使用XML 属性_模版_09 <xs:element name="PONumber" type="xs:string"/>

10CodeSmith实用技巧(六):使用XML 属性_xml文件_10 <xs:element name="CustomerName" type="xs:string"/>

11CodeSmith实用技巧(六):使用XML 属性_c#_11 <xs:element name="CustomerCity" type="xs:string"/>

12CodeSmith实用技巧(六):使用XML 属性_c#_12 <xs:element name="CustomerState" type="xs:string"/>

13CodeSmith实用技巧(六):使用XML 属性_xml_13 <xs:element name="Items">

14CodeSmith实用技巧(六):使用XML 属性_模版_14 <xs:complexType>

15CodeSmith实用技巧(六):使用XML 属性_元数据_15 <xs:sequence>

16CodeSmith实用技巧(六):使用XML 属性_c#_16 <xs:element name="Item" maxOccurs="unbounded">

17CodeSmith实用技巧(六):使用XML 属性_元数据_17 <xs:complexType>

18CodeSmith实用技巧(六):使用XML 属性_模版_18 <xs:attribute name="ItemNumber" type="xs:string" use="required"/>

19CodeSmith实用技巧(六):使用XML 属性_xml_19 <xs:attribute name="Quantity" type="xs:integer" use="required"/>

20CodeSmith实用技巧(六):使用XML 属性_元数据_20 </xs:complexType>

21CodeSmith实用技巧(六):使用XML 属性_c#_21 </xs:element>

22CodeSmith实用技巧(六):使用XML 属性_元数据_22 </xs:sequence>

23CodeSmith实用技巧(六):使用XML 属性_模版_23 </xs:complexType>

24CodeSmith实用技巧(六):使用XML 属性_模版_24 </xs:element>

25CodeSmith实用技巧(六):使用XML 属性_xml文件_25 </xs:sequence>

26CodeSmith实用技巧(六):使用XML 属性_模版_26 </xs:complexType>

27CodeSmith实用技巧(六):使用XML 属性_xml_27 </xs:element>

28CodeSmith实用技巧(六):使用XML 属性_xml_28</xs:schema>

29CodeSmith实用技巧(六):使用XML 属性_xml_29

30CodeSmith实用技巧(六):使用XML 属性_元数据_30

这是一个简单的带有Schema的XML Property的例子:

利用这个Schema文件,我们可以定义一个XML Property来在运行时读去元数据。


CodeSmith实用技巧(六):使用XML 属性_元数据_31<%@ CodeTemplate Language="C#" TargetLanguage="Text" Description="Create packing list from XML PO." %>

CodeSmith实用技巧(六):使用XML 属性_c#_32<%@ XmlProperty Name="PurchaseOrder" Schema="PO.xsd" Optional="False" Category="Data" Description="Purchase Order to generate packing list for." %>

CodeSmith实用技巧(六):使用XML 属性_c#_33Packing List

CodeSmith实用技巧(六):使用XML 属性_c#_34ref: PO#<%= PurchaseOrder.PONumber %>

CodeSmith实用技巧(六):使用XML 属性_模版_35Ship To:

CodeSmith实用技巧(六):使用XML 属性_模版_36<%= PurchaseOrder.CustomerName %>

CodeSmith实用技巧(六):使用XML 属性_c#_37<%= PurchaseOrder.CustomerCity %>, <%= PurchaseOrder.CustomerState %>

CodeSmith实用技巧(六):使用XML 属性_元数据_38Contents:

CodeSmith实用技巧(六):使用XML 属性_xml_39CodeSmith实用技巧(六):使用XML 属性_模版_40<% for (int i = 0; i < PurchaseOrder.Items.Count; i++) { %>

CodeSmith实用技巧(六):使用XML 属性_元数据_41<%= PurchaseOrder.Items[i].ItemNumber %>, Quantity <%= PurchaseOrder.Items[i].Quantity %>

CodeSmith实用技巧(六):使用XML 属性_元数据_42<% } %>

CodeSmith实用技巧(六):使用XML 属性_c#_43

CodeSmith实用技巧(六):使用XML 属性_xml文件_44

在运行时,PurchaseOrder属性在属性面板中显示为按钮,单击后弹出一个对话框供用户选择XML文件。

CodeSmith实用技巧(六):使用XML 属性_元数据_45

选择一个XML文件。在该例子XML文件内容如下:


1CodeSmith实用技巧(六):使用XML 属性_xml_46<?xml version="1.0" encoding="UTF-8"?>

2CodeSmith实用技巧(六):使用XML 属性_xml_47<PurchaseOrder xmlns=http://www.codesmithtools.com/PO

3CodeSmith实用技巧(六):使用XML 属性_元数据_48 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

4CodeSmith实用技巧(六):使用XML 属性_模版_49 <PONumber>5271</PONumber>

5CodeSmith实用技巧(六):使用XML 属性_xml_50 <CustomerName>John Nelson</CustomerName>

6CodeSmith实用技巧(六):使用XML 属性_元数据_51 <CustomerCity>Gamonetta</CustomerCity>

7CodeSmith实用技巧(六):使用XML 属性_模版_52 <CustomerState>MS</CustomerState>

8CodeSmith实用技巧(六):使用XML 属性_元数据_53 <Items>

9CodeSmith实用技巧(六):使用XML 属性_c#_54 <Item ItemNumber="HM85" Quantity="12"/>

10CodeSmith实用技巧(六):使用XML 属性_xml_55 <Item ItemNumber="JR82" Quantity="4"/>

11CodeSmith实用技巧(六):使用XML 属性_模版_56 <Item ItemNumber="PR43" Quantity="6"/>

12CodeSmith实用技巧(六):使用XML 属性_c#_57 </Items>

13CodeSmith实用技巧(六):使用XML 属性_模版_58</PurchaseOrder>

14CodeSmith实用技巧(六):使用XML 属性_xml文件_59

15CodeSmith实用技巧(六):使用XML 属性_元数据_60

生成后的代码如下:

CodeSmith实用技巧(六):使用XML 属性_模版_61Packing List

CodeSmith实用技巧(六):使用XML 属性_xml_62ref: PO#5271

CodeSmith实用技巧(六):使用XML 属性_xml_63Ship To:

CodeSmith实用技巧(六):使用XML 属性_模版_64John Nelson

CodeSmith实用技巧(六):使用XML 属性_xml_65Gamonetta, MS

CodeSmith实用技巧(六):使用XML 属性_xml文件_66Contents:

CodeSmith实用技巧(六):使用XML 属性_xml文件_67HM85, Quantity 12

CodeSmith实用技巧(六):使用XML 属性_xml_68JR82, Quantity 4

CodeSmith实用技巧(六):使用XML 属性_c#_69PR43, Quantity 6

2.XML Property Without a Schema

这是一个不带Schema的XML Property的例子。这个模版在运行时可以访问任何XML文件。


CodeSmith实用技巧(六):使用XML 属性_元数据_70<%@ CodeTemplate Language="VB" TargetLanguage="Text" Description="List top-level nodes in an XML file." %>

CodeSmith实用技巧(六):使用XML 属性_c#_71<%@ XmlProperty Name="TargetFile" Optional="False" Category="Data" Description="XML file to iterate." %>

CodeSmith实用技巧(六):使用XML 属性_模版_72<%@ Assembly Name="System.Xml" %>

CodeSmith实用技巧(六):使用XML 属性_c#_73<%@ Import Namespace="System.Xml" %>

CodeSmith实用技巧(六):使用XML 属性_模版_74Top-level nodes:

CodeSmith实用技巧(六):使用XML 属性_xml文件_75<% Dim currNode as XmlNode

CodeSmith实用技巧(六):使用XML 属性_元数据_76currNode = TargetFile.DocumentElement.FirstChild

CodeSmith实用技巧(六):使用XML 属性_xml文件_77Do Until currNode Is Nothing%>

CodeSmith实用技巧(六):使用XML 属性_模版_78 <%= currNode.InnerXml %>

CodeSmith实用技巧(六):使用XML 属性_元数据_79<% currNode = currNode.NextSibling()

CodeSmith实用技巧(六):使用XML 属性_模版_80Loop %>

CodeSmith实用技巧(六):使用XML 属性_模版_81

CodeSmith实用技巧(六):使用XML 属性_c#_82

概莫版对目标文件的属性并没有定义一个Schema,所以属性在模版中是作为一个XMLDocument。如果我们选择的XML文件如下所示:


1CodeSmith实用技巧(六):使用XML 属性_c#_83<?xml version="1.0" encoding="UTF-8"?>

2CodeSmith实用技巧(六):使用XML 属性_xml文件_84<Books>

3CodeSmith实用技巧(六):使用XML 属性_元数据_85   <Book>UML 2.0 In a Nutshell</Book>

4CodeSmith实用技巧(六):使用XML 属性_xml_86   <Book>The Best Software Writing</Book>

5CodeSmith实用技巧(六):使用XML 属性_元数据_87   <Book>Coder to Developer</Book>

6CodeSmith实用技巧(六):使用XML 属性_xml文件_88   <Book>Code Complete</Book>

7CodeSmith实用技巧(六):使用XML 属性_xml文件_89</Books>


生成后的代码:

CodeSmith实用技巧(六):使用XML 属性_c#_90Top-level nodes:

CodeSmith实用技巧(六):使用XML 属性_xml文件_91UML 2.0 In a Nutshell

CodeSmith实用技巧(六):使用XML 属性_xml_92The Best Software Writing

CodeSmith实用技巧(六):使用XML 属性_c#_93Coder to Developer

CodeSmith实用技巧(六):使用XML 属性_xml_94Code Complete

CodeSmith实用技巧(六):使用XML 属性_xml文件_95