Установить программно созданный XML-документ для открытия с помощью шаблона InfoPath в SharePoint
У меня проблема с получением XML-документов, которые я создаю программным способом, и добавляю их в библиотеку форм в SharePoint, чтобы открывать их с помощью шаблона InfoPath, а не просто открывать их в виде простых XML-документов в Internet Explorer.
По сути, у меня есть веб-сервис, который проверяет базу данных, чтобы узнать, выполняются ли определенные условия. Если это так, веб-служба программно создает документ XML, имеющий ту же схему XML, что и файлы, созданные с помощью шаблона InfoPath, упомянутого ранее. Обычный процесс состоит в том, что реальный пользователь открывает этот шаблон InfoPath, заполняет данные и нажимает кнопку SUBMIT, которая создает XML-документ за кулисами и сохраняет его в библиотеке форм. Когда пользователь заходит в библиотеку форм для последующего просмотра этого XML-документа, документ автоматически открывается с помощью шаблона InfoPath (а не открывается как XML-документ в Internet Explorer).
Я пытаюсь выяснить, почему мои XML-документы, сгенерированные из веб-службы, ведут себя в этом отношении иначе, чем XML-документы, сгенерированные из InfoPath. Вот фрагмент кода, который я использую для создания XML-документа внутри веб-службы:
//specify path to the SharePoint site and the form library
var clientContext = new ClientContext("http://urlToSiteContainingTheFormLibrary");
var site = clientContext.Web;
clientContext.Load(site);
var folder = site.GetFolderByServerRelativeUrl("FormLibraryNameHere");
clientContext.Load(folder);
clientContext.ExecuteQuery();
//create new file to add to the form library
var fci = new FileCreationInformation();
var encoding = new System.Text.UTF8Encoding();
//load the InfoPath document's XML schema from resources file
var baseXml = XElement.Load(new StringReader(Properties.Resources.BaseXml));
//fill out the appropriate elements and attributes of the XML here
//......
//
//set remaining properties of the new FileCreationInformation object
byte[] array = encoding.GetBytes(baseXml.ToString());
fci.Content = array;
fci.Overwrite = true;
fci.Url = "DocumentName"
//add the new file to the form library
var newFile = folder.Files.Add(fci);
clientContext.Load(newFile);
var item = newFile.ListItemAllFields;
clientContext.Load(item);
//set metadata for the xml file here
item["HTML_x0020_File_x0020_Type"] = "InfoPath.Document.3";
item["TemplateUrl"] =
"http://templateUrlHere/template.xsn?openin=preferclient&noredirect=true&xsnlocation=/templateLocation/template.xsn";
//set remaining item properties......
//update changes to the item
item.Update();
//commit the changes
clientContext.ExecuteQuery();
На этом этапе мой XML-документ успешно отправлен в мою библиотеку форм, но когда я открываю его, он открывается как обычный XML-код в Internet Explorer, а не с использованием указанного мной шаблона. Я бы предположил, что свойства HTML_x0020_File_x0020_Type и TemplateUrl этого элемента будут указывать достаточно информации для SharePoint, чтобы он знал, что ему нужно открыть этот файл с помощью шаблона InfoPath, но, возможно, есть и другое свойство, которое мне нужно установить. Кто-нибудь имел опыт работы с подобной проблемой? Сначала я думал, что URL, который я использовал для своего шаблона, был неправильным, но я скопировал его непосредственно из существующего XML-документа, созданного с помощью шаблона InfoPath, поэтому я не думаю, что это проблема (я не учел URL и имена файлов в моем примере кода выше, поэтому, пожалуйста, игнорируйте тот факт, что эти URL неверны). Я продолжаю устранять эту проблему, но в то же время я подумал, что кто-то мог решить эту проблему раньше и может дать некоторое представление.
Заранее благодарю за любые ответы, я ценю любую помощь, которая предлагается.
1 ответ
Я знаю, что прошло много времени с тех пор, как был задан этот вопрос, но я думаю, что нашел решение или, по крайней мере, проблему.
Я недавно решил ту же проблему.
При загрузке одного из файлов, которые отображались в формате xml, когда они фактически являлись InfoPath, открытие его в блокноте показало, что количество реальных символов мусора по крайней мере равно количеству пустых символов мусора.
Оказывается, я использовал XmlTextWriter
написать в MemoryStream
, в XmlTextWriter
я использую Encoding.UTF8
, После изменения на Encoding.Default файлы были правильно сохранены и отображены как InfoPath.
Таким образом, для любого с подобной проблемой, проверьте значение в файле XML, попробуйте удалить пустые значения, если таковые имеются, и перезагрузите. Затем проверьте код, создающий документ, и, если он записывается как UTF8, попробуйте другую кодировку, например UTF16.