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

1XML Property With a Schema

 1CodeSmith实用技巧(六):使用XML 属性<?xml version="1.0" encoding="UTF-8"?>
 2CodeSmith实用技巧(六):使用XML 属性<xs:schema targetNamespace=http://www.codesmithtools.com/PO
 3CodeSmith实用技巧(六):使用XML 属性     xmlns:xs=http://www.w3.org/2001/XMLSchema
 4CodeSmith实用技巧(六):使用XML 属性     xmlns=http://www.codesmithtools.com/PO
 5CodeSmith实用技巧(六):使用XML 属性     elementFormDefault="qualified" attributeFormDefault="unqualified">
 6CodeSmith实用技巧(六):使用XML 属性   <xs:element name="PurchaseOrder">
 7CodeSmith实用技巧(六):使用XML 属性     <xs:complexType>
 8CodeSmith实用技巧(六):使用XML 属性       <xs:sequence>
 9CodeSmith实用技巧(六):使用XML 属性         <xs:element name="PONumber" type="xs:string"/>
10CodeSmith实用技巧(六):使用XML 属性         <xs:element name="CustomerName" type="xs:string"/>
11CodeSmith实用技巧(六):使用XML 属性         <xs:element name="CustomerCity" type="xs:string"/>
12CodeSmith实用技巧(六):使用XML 属性         <xs:element name="CustomerState" type="xs:string"/>
13CodeSmith实用技巧(六):使用XML 属性         <xs:element name="Items">
14CodeSmith实用技巧(六):使用XML 属性          <xs:complexType>
15CodeSmith实用技巧(六):使用XML 属性            <xs:sequence>
16CodeSmith实用技巧(六):使用XML 属性              <xs:element name="Item" maxOccurs="unbounded">
17CodeSmith实用技巧(六):使用XML 属性                <xs:complexType>
18CodeSmith实用技巧(六):使用XML 属性                  <xs:attribute name="ItemNumber" type="xs:string" use="required"/>
19CodeSmith实用技巧(六):使用XML 属性                  <xs:attribute name="Quantity" type="xs:integer" use="required"/>
20CodeSmith实用技巧(六):使用XML 属性                </xs:complexType>
21CodeSmith实用技巧(六):使用XML 属性              </xs:element>
22CodeSmith实用技巧(六):使用XML 属性            </xs:sequence>
23CodeSmith实用技巧(六):使用XML 属性          </xs:complexType>
24CodeSmith实用技巧(六):使用XML 属性         </xs:element>
25CodeSmith实用技巧(六):使用XML 属性       </xs:sequence>
26CodeSmith实用技巧(六):使用XML 属性     </xs:complexType>
27CodeSmith实用技巧(六):使用XML 属性   </xs:element>
28CodeSmith实用技巧(六):使用XML 属性</xs:schema>
29CodeSmith实用技巧(六):使用XML 属性
30CodeSmith实用技巧(六):使用XML 属性

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

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

CodeSmith实用技巧(六):使用XML 属性<%@ CodeTemplate Language="C#" TargetLanguage="Text" Description="Create packing list from XML PO." %>
CodeSmith实用技巧(六):使用XML 属性
<%@ XmlProperty Name="PurchaseOrder" Schema="PO.xsd" Optional="False" Category="Data" Description="Purchase Order to generate packing list for." %>
CodeSmith实用技巧(六):使用XML 属性Packing List
CodeSmith实用技巧(六):使用XML 属性
ref: PO#<%= PurchaseOrder.PONumber %>
CodeSmith实用技巧(六):使用XML 属性Ship To:
CodeSmith实用技巧(六):使用XML 属性
<%= PurchaseOrder.CustomerName %>
CodeSmith实用技巧(六):使用XML 属性
<%= PurchaseOrder.CustomerCity  %><%= PurchaseOrder.CustomerState %>
CodeSmith实用技巧(六):使用XML 属性Contents:

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

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

 1CodeSmith实用技巧(六):使用XML 属性<?xml version="1.0" encoding="UTF-8"?>
 2CodeSmith实用技巧(六):使用XML 属性<PurchaseOrder xmlns=http://www.codesmithtools.com/PO
 3CodeSmith实用技巧(六):使用XML 属性     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 4CodeSmith实用技巧(六):使用XML 属性   <PONumber>5271</PONumber>
 5CodeSmith实用技巧(六):使用XML 属性   <CustomerName>John Nelson</CustomerName>
 6CodeSmith实用技巧(六):使用XML 属性   <CustomerCity>Gamonetta</CustomerCity>
 7CodeSmith实用技巧(六):使用XML 属性   <CustomerState>MS</CustomerState>
 8CodeSmith实用技巧(六):使用XML 属性   <Items>
 9CodeSmith实用技巧(六):使用XML 属性     <Item ItemNumber="HM85" Quantity="12"/>
10CodeSmith实用技巧(六):使用XML 属性     <Item ItemNumber="JR82" Quantity="4"/>
11CodeSmith实用技巧(六):使用XML 属性     <Item ItemNumber="PR43" Quantity="6"/>
12CodeSmith实用技巧(六):使用XML 属性   </Items>
13CodeSmith实用技巧(六):使用XML 属性</PurchaseOrder>
14CodeSmith实用技巧(六):使用XML 属性
15CodeSmith实用技巧(六):使用XML 属性

生成后的代码如下:

CodeSmith实用技巧(六):使用XML 属性Packing List
CodeSmith实用技巧(六):使用XML 属性ref: PO#5271
CodeSmith实用技巧(六):使用XML 属性Ship To:
CodeSmith实用技巧(六):使用XML 属性John Nelson
CodeSmith实用技巧(六):使用XML 属性Gamonetta, MS
CodeSmith实用技巧(六):使用XML 属性Contents:
CodeSmith实用技巧(六):使用XML 属性HM85, Quantity 12
CodeSmith实用技巧(六):使用XML 属性JR82, Quantity 4
CodeSmith实用技巧(六):使用XML 属性PR43, Quantity 6

2XML Property Without a Schema

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

CodeSmith实用技巧(六):使用XML 属性<%@ CodeTemplate Language="VB" TargetLanguage="Text" Description="List top-level nodes in an XML file." %>
CodeSmith实用技巧(六):使用XML 属性
<%@ XmlProperty Name="TargetFile" Optional="False" Category="Data" Description="XML file to iterate." %>
CodeSmith实用技巧(六):使用XML 属性
<%@ Assembly Name="System.Xml" %>
CodeSmith实用技巧(六):使用XML 属性
<%@ Import Namespace="System.Xml" %>
CodeSmith实用技巧(六):使用XML 属性Top
-level nodes:
CodeSmith实用技巧(六):使用XML 属性
<% Dim currNode as XmlNode
CodeSmith实用技巧(六):使用XML 属性currNode 
= TargetFile.DocumentElement.FirstChild
CodeSmith实用技巧(六):使用XML 属性Do Until currNode Is Nothing
%>
CodeSmith实用技巧(六):使用XML 属性   
<%= currNode.InnerXml %>
CodeSmith实用技巧(六):使用XML 属性
<% currNode = currNode.NextSibling()
CodeSmith实用技巧(六):使用XML 属性Loop 
%>
CodeSmith实用技巧(六):使用XML 属性
CodeSmith实用技巧(六):使用XML 属性

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

1CodeSmith实用技巧(六):使用XML 属性<?xml version="1.0" encoding="UTF-8"?>
2CodeSmith实用技巧(六):使用XML 属性<Books>
3CodeSmith实用技巧(六):使用XML 属性   <Book>UML 2.0 In a Nutshell</Book>
4CodeSmith实用技巧(六):使用XML 属性   <Book>The Best Software Writing</Book>
5CodeSmith实用技巧(六):使用XML 属性   <Book>Coder to Developer</Book>
6CodeSmith实用技巧(六):使用XML 属性   <Book>Code Complete</Book>
7CodeSmith实用技巧(六):使用XML 属性</Books>

生成后的代码:

CodeSmith实用技巧(六):使用XML 属性Top-level nodes:
CodeSmith实用技巧(六):使用XML 属性UML 2.0 In a Nutshell
CodeSmith实用技巧(六):使用XML 属性The Best Software Writing
CodeSmith实用技巧(六):使用XML 属性Coder to Developer
CodeSmith实用技巧(六):使用XML 属性Code Complete
CodeSmith实用技巧(六):使用XML 属性

相关文章: