我的共享点网站上有一个表单库。以编程方式我需要填写一些字段。我能这样做吗?如果有人知道请提供一些示例代码。首先,我需要检索infopath文档,然后我需要填写字段。
答案 0 :(得分:5)
发布的axel_c非常接近。这是一些经过清理和验证的工作代码...
public static void ChangeFields()
{
//Open SharePoint site
using (SPSite site = new SPSite("http://<SharePoint_Site_URL>"))
{
using (SPWeb web = site.OpenWeb())
{
//Get handle for forms library
SPList formsLib = web.Lists["FormsLib"];
if (formsLib != null)
{
foreach (SPListItem item in formsLib.Items)
{
XmlDocument xml = new XmlDocument();
//Open XML file and load it into XML document
using (Stream s = item.File.OpenBinaryStream())
{
xml.Load(s);
}
//Do your stuff with xml here. This is just an example of setting a boolean field to false.
XmlNodeList nodes = xml.GetElementsByTagName("my:SomeBooleanField");
foreach (XmlNode node in nodes)
{
node.InnerText = "0";
}
//Get binary data for new XML
byte[] xmlData = System.Text.Encoding.UTF8.GetBytes(xml.OuterXml);
using (MemoryStream ms = new MemoryStream(xmlData))
{
//Write data to SharePoint XML file
item.File.SaveBinary(ms);
}
}
}
}
}
}
答案 1 :(得分:0)
Infopath文档只是一个常规XML文件,其结构与您在Infopath表单中定义的数据源相匹配。
您只需要通过SharePoint对象模型访问该文件,使用标准方法(XmlDocument API)对其进行修改,然后将其写回SharePoint列表。您必须小心保留结构并插入有效数据,否则您将无法使用Infopath打开表单。
如果您计划进行任何认真的开发,您应该查看一本关于SharePoint的书。 Infopath也是一个雷区。
对象模型用法示例:here,here和here。可疑的MSDN参考文档非常不完整here。
编辑:这是一些示例代码。我还没有完成SharePoint一段时间,所以我不确定这是100%正确,但它应该足以让你开始:
// Open SharePoint site
using (SPSite site = new SPSite("http://<SharePoint_Site_URL>"))
{
using (SPWeb web = site.OpenWeb())
{
// Get handle for forms library
SPList formsLib = web.Lists["FormsLib"];
if (formsLib != null)
{
SPListItem itm = formsLib.Items["myform.xml"];
// Open xml and load it into XML document
using (Stream s = itm.File.OpenBinary ())
{
MemoryStream ms;
byte[] xmlData;
XmlDocument xml = new XmlDocument ();
xml.Load (s);
s.Close ();
// Do your stuff with xml here ...
// Get binary data for new XML
xmlData = System.Text.Encoding.UTF8.GetBytes (xml.DocumentElement.OuterXml);
ms = new MemoryStream (xmlData);
// Write data to sharepoint item
itm.File.SaveBinary (ms);
ms.Close ();
itm.Update ();
}
}
web.Close();
}
site.Close();
}
答案 2 :(得分:0)
这取决于您可用的工具集,技能和确切要求。
在InfoPath表单中预填充数据有两种主要方式。
将相关字段导出为表单发布过程的一部分。然后,这些字段将成为文档/表单库中的列,您可以通过工作流或自定义代码所在的位置手动操作它们。
使用类似于之前Axel_c提供的代码直接操作表单。这里最大的问题是:什么会触发这段代码?文档库中的事件接收器,SharePoint Designer工作流,Visual Studio工作流等?
如果您尝试从SharePoint Designer工作流程执行此操作,请查看Workflow Power Pack for SharePoint。它允许将C#和VB代码直接嵌入到工作流中,而无需复杂的Visual Studio开发。有关如何从工作流can be found here查询InfoPath数据的示例。如果你有一些开发技巧,你应该能够修改它以满足你的需求。
我还推荐网站www.infopathdev.com,他们有优秀且活跃的论坛。你几乎肯定会在那里找到你的问题的答案。
答案 3 :(得分:0)
感谢您提供示例代码@axel_c和@Jeff Burt
以下是Jeff Burt为我需要的文档集中的文件修改的相同代码。如果您还没有文档集参考,可以查看此站点如何获取一个: http://howtosharepoint.blogspot.com/2010/12/programmatically-create-document-set.html
此外,代码将打开infopath表单的.xml版本,而不是您可能遇到的.xsn模板版本。
再次感谢所有人......
private void ChangeFields(DocumentSet docSet)
{
string extension = "";
SPFolder documentsetFolder = docSet.Folder;
foreach (SPFile file in documentsetFolder.Files)
{
extension = Path.GetExtension(file.Name);
if (extension != ".xml") //check if it's a valid xml file
return;
XmlDocument xml = new XmlDocument();
//Open XML file and load it into XML document, needs to be .xml file not .xsn
using (Stream s = file.OpenBinaryStream())
{
xml.Load(s);
}
//Do your stuff with xml here. This is just an example of setting a boolean field to false.
XmlNodeList nodes = xml.GetElementsByTagName("my:fieldtagname");
foreach (XmlNode node in nodes)
{
node.InnerText = "xyz";
}
//Get binary data for new XML
byte[] xmlData = System.Text.Encoding.UTF8.GetBytes(xml.OuterXml);
using (MemoryStream ms = new MemoryStream(xmlData))
{
//Write data to SharePoint XML file
file.SaveBinary(ms);
}
}
}
答案 4 :(得分:0)
我遇到了这个问题并在Jeff Burt / Axel_c的帖子的帮助下解决了这个问题。
我试图使用XMLDocument.Save([stream])和SPItem.File.SaveBinary([stream])方法将更新的InfoPath XML文件写回SharePoint库。似乎XMLDocument.Save([stream])使用错误的编码将文件写回SharePoint,无论XML声明中的内容如何。
尝试打开更新的InfoPath表单时,我不断收到错误“表单中的计算尚未完成......”
我已经编写了这两个函数来获取和更新InfoPath表单。只需以通常的方式操作从ReadSPFiletoXMLdocument()返回的XML,然后使用WriteXMLtoSPFile()将其发送回服务器。
private System.Xml.XmlDocument ReadSPFiletoXMLdocument(SPListItem item)
{
//get SharePoint file XML
System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument();
try
{
using (System.IO.Stream xmlStream = item.File.OpenBinaryStream())
{
xDoc.Load(xmlStream);
}
}
catch (Exception ex)
{
//put your own error handling here
}
return xDoc;
}
private void WriteXMLtoSPFile(SPListItem item, XmlDocument xDoc)
{
byte[] xmlData = System.Text.Encoding.UTF8.GetBytes(xDoc.OuterXml);
try
{
using (System.IO.MemoryStream outStream = new System.IO.MemoryStream(xmlData))
{
item.File.SaveBinary(outStream);
}
}
catch (Exception ex)
{
//put your own error handling here
}
}