设计完InfoPath模板之后,需要将其发布到一个公共的地方(如公共网络上),用户可以下载该模板填写内容然后生成固定格式的XML数据文件。一个复杂的InfoPath模板可以包含一个主数据源(Schema文件)或多个辅助数据源,并且其中还可能包括VSTA(Visual Studio Tools for Application)所生成的代码。InfoPath模板源文件和已经发布过的模板文件后缀相同(均为.xsn),但是对于一个已经发布过的InfoPath模板文件而言,由于缺少对应的源代码(包括原始schema文件、辅助数据源文件、VSTA源代码等等),我们很难对其进行重新设计。有什么好的方法可以实现这一点呢?

  答案是肯定的!

  首先,在公共网络上找到已经发布过的InfoPath模板xsn文件并下载到本地。右键点击xsn文件选择Design,然后你可以重新对InfoPath模板的界面进行修改,但无法直接修改主数据源的schema。退出设计模式,将xsn文件的后缀直接改成cab,双击打开,你可以看到里面包含了许多你所需要的文件,包括manifest.xsf文件(InfoPath Form的定义文件),主数据源的schema文件,view1.xsl界面定义文件,template.xml,sampledata.xml,以及其它辅助数据源文件和第三方提供的控件,VBTA所编译的.dll文件等。

  几乎所有的定义文件都能手动修改,你可以直接将cab文件中需要修改的文件拖放到其它位置手动进行修改,然后设计xsn文件重新指定这些修改过的文件。或者也可以将cab文件中所有的文件拖放到一个新的文件夹中,然后修改需要的文件,右键点击manifest.xsf文件,选择Design,将InfoPath另存为一个新的文件。注意,如果你重新定义过主数据源的schema文件,则需要在InfoPath设计中查看控件的绑定情况,确保所有的控件绑定是正确的。如果需要修改XML节点的前缀,则需要同时修改manifest.xsf,view1.xsl,template.xml和主数据源的schema文件。

  在schema定义文件中,属性attributeFormDefault规定了所生成的XML节点的属性是否必须定义前缀,值为unqualified不需要,值为qualified需要;属性elementFormDefault规定了所生成的XML节点是否必须定义前缀,值为unqualified不需要,值为qualified需要。如下面的代码:

<xs:schema attributeFormDefault=”unqualified” elementFormDefault=”qualified” targetNamespace=http://www.jaxu.com xmlns:j=http://www.jaxu.com>
</xs:schema>

  属性targetNameSpace规定了所生成的XML节点或属性的前缀所对应的命名空间,该命名空间必须与后面指定的命名空间定义具有相同的URI。对于前缀的指定,在manifest.xsf,view1.xsl和template.xml文件中必须具有相同的URI。也就是说,如果你想要修改InfoPath所生成的XML文件中节点或属性的前缀,则这四个文件中的前缀定义均要修改成一致。

  dll文件不能直接修改。不过你可以反编译并重新创建VSTA工程。

  修改完后,重新打包并设计InfoPath文件,然后重新发布即完成了模板的更新。注意你可能需要重新为其指定签名。