利用InfoPath生成XML资源文件

由于普通列表的新建、修改或显示窗体往往不能满足一些业务的需要,我们常常需要通过“自定义表单”的方式将列表的默认窗体变成InfoPath表单模式,这样可以为其增加数据连接和简单设置很多的规则,特别是在有的时候,我们需要在一个列表中更新另外一个列表的数据,当然通过写事件能很好的满足需要,不过在不写事件的情况下也是可以采用其他方式来实现的。

这个时候我们需要建立一些域来装载其他列表的记录,这里最简单的有一种方式,就是在当前列表中建立一些字段来存储,但是这样的话,就相当于在当前列表建立了一些与此列表无关的Field,这样做当然不好,还有一种方式,就是自己写XML文件做辅助数据源,但是很多人对这个XML文件的结构构造不是很清楚,那么有没有一种简单的方式来实现呢?

下面就来介绍一种简单的方法,首先假设我有几种字段,分别是文本,数字,货币,日期时间,并且我希望能对这些字段做到输入的限制,那么首先打开InfoPath Designer,然后新建一个空白表单,在这个空白表单中建立4个域,具体如下:

名称 类型 数据类型
文本 域(元素) 文本
数字 域(元素) 整数
货币 域(元素) 小数
日期时间 域(元素) 日期和时间

然后将选择“文件”—“发布”—“导出”—“导出源文件”到某一文件夹,然后会看到该InfoPath导出生成了如下5个文件:

manifest.xsf——InfoPath的定义文件,定义整个InfoPath的组成结构,里面会指定该InfoPath的其它文件,并且必须是InfoPath中的第一个文件

myschema.xsd——InfoPath的架构文件,定义该InfoPath里面的包含的域和域的类型

sampledata.xml——包含InfoPath的域

template.xml——新建表单的时候进行实例化InfoPath

view1.xsl——存储InfoPath中视图样式的文件

在这5个文件中,我们需要用到myschema.xsd和sampledata.xml这两个文件,用记事本打开这两个文件,先看看里面的XML的具体内容。

myschema.xsd如下:

View Code
 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <xsd:schema targetNamespace="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-12-22T14:43:59" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-12-22T14:43:59" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3 <xsd:element name="myFields">
4 <xsd:complexType>
5 <xsd:sequence>
6 <xsd:element ref="my:文本" minOccurs="0"/>
7 <xsd:element ref="my:数字" minOccurs="0"/>
8 <xsd:element ref="my:货币" minOccurs="0"/>
9 <xsd:element ref="my:日期时间" minOccurs="0"/>
10 </xsd:sequence>
11 <xsd:anyAttribute processContents="lax" namespace="http://www.w3.org/XML/1998/namespace"/>
12 </xsd:complexType>
13 </xsd:element>
14 <xsd:element name="文本" type="xsd:string"/>
15 <xsd:element name="数字" nillable="true" type="xsd:integer"/>
16 <xsd:element name="货币" nillable="true" type="xsd:double"/>
17 <xsd:element name="日期时间" nillable="true" type="xsd:dateTime"/>
18 </xsd:schema>

sampledata.xml如下:

View Code
 1 <my:myFields xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-12-22T14:43:59" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003">
2 <my:文本/>
3 <my:数字/>
4 <my:货币/>
5 <my:日期时间/>
6 <xd:SchemaInfo LocalName="myFields" NamespaceURI="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-12-22T14:43:59">
7 <xd:Namespaces>
8 <xd:Namespace LocalName="myFields" NamespaceURI="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-12-22T14:43:59"/>
9 </xd:Namespaces>
10 </xd:SchemaInfo>
11 </my:myFields>

先将sampledata.xml文件中的内容整个复制到一个新的记事本中去,然后将myschema.xsd中的内容除去下面的头文件声明外其它的内容复制:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

将复制的内容插入到刚刚那个记事本中节“<my:myFields>”里面,粘贴完后记事本的内容如下:

 1 <my:myFields xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-12-22T14:43:59" 
2
3 xmlns:xd="http://schemas.microsoft.com/office/infopath/2003">
4 <xsd:schema targetNamespace="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-12-22T14:43:59"
5
6 xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-12-22T14:43:59"
7
8 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
9 <xsd:element name="myFields">
10 <xsd:complexType>
11 <xsd:sequence>
12 <xsd:element ref="my:文本" minOccurs="0"/>
13 <xsd:element ref="my:数字" minOccurs="0"/>
14 <xsd:element ref="my:货币" minOccurs="0"/>
15 <xsd:element ref="my:日期时间" minOccurs="0"/>
16 </xsd:sequence>
17 <xsd:anyAttribute processContents="lax" namespace="http://www.w3.org/XML/1998/namespace"/>
18 </xsd:complexType>
19 </xsd:element>
20 <xsd:element name="文本" type="xsd:string"/>
21 <xsd:element name="数字" nillable="true" type="xsd:integer"/>
22 <xsd:element name="货币" nillable="true" type="xsd:double"/>
23 <xsd:element name="日期时间" nillable="true" type="xsd:dateTime"/>
24 </xsd:schema>
25 <my:文本/>
26 <my:数字/>
27 <my:货币/>
28 <my:日期时间/>
29 <xd:SchemaInfo LocalName="myFields"
30
31 NamespaceURI="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-12-22T14:43:59">
32 <xd:Namespaces>
33 <xd:Namespace LocalName="myFields"
34
35 NamespaceURI="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-12-22T14:43:59"/>
36 </xd:Namespaces>
37 </xd:SchemaInfo>
38 </my:myFields>

现在将这个记事本文件保存为XML文件,因为里面有中文字符,所以保存的时候,在编码位置要选择“UTF-8”,然后命名为123.xml:

现在我们就可以将这个123.xml拿来用了,我们随便给一个InfoPath添加一个自XML文档接收数据的数据连接,XML文档选择123.xml,然后在InfoPath中可以清楚的看到辅助数据源123的架构:

然后我们将其拖出来使用,可以清楚的看到所有域的数据类型都可我最开始定义的类型一致,分别是文本,整数,小数,日期和时间类型,并且日期时间是DateTime控件,这些达到了我们限定输入的要求:

但是这里需要注意一点,用户类型没办法实现用“个人/组选取器”控件来控制输入,如果要控制用户字段输入还是只能在当前列表建立一个Field来实现。

原文地址:https://www.cnblogs.com/leolis/p/2298757.html