从 Sharepoint 打开 InfoPath xml 进行 xml 处理
Open InfoPath xml from Sharepoint for xml processing
我目前正在处理一个项目(WinForms、C#、VS2012),我需要从 SharePoint(我认为是 2010)文档库加载一个 InfoPath-XML 文件并进行一些嗅探对于其中的特殊元素。
我不是在 SharePoint 服务器上开发,因为与 SharePoint 的连接只是程序实际执行的一小部分。我只是插入一些 SharePoint 列表来假装我正在查询数据库。 (我知道,SharePoint 列表在适当的数据库意义上不是数据库表,但这不是重点)列表包含对我的程序至关重要的数据,并且通过 Web 服务获取列表内容非常简单。
我没有使用 SharePoint 对象模型 (SharePoint*.dll),因为我没有这些并且无法正确引用它们,Web 服务直到现在都运行良好。
查询列表后,我知道存储在文档库中的文件的文件名。当我 assemble 此文件的 url 并将其粘贴到我选择的浏览器中时,SharePoint 在其 GUI 中显示该文件,因为它显示在 InfoPath 中(当我粘贴完全相同的 url).
我在本地保存了一份 xml。我可以轻松地将其打开并处理为 xml。但是,当我尝试直接从服务器打开文件时,我的 Stream(或 FileStream)包含 HTML-SharePoint 站点的代码,向我显示我的 InfoPath 文档。这是我的打开代码:
string Path = @"awesome-correct-url";
WebRequest request = WebRequest.Create(Path);
request.UseDefaultCredentials = true; //SharePoint needs to know I am allowed to open the file
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream fs = response.GetResponseStream();
StreamReader sr = new StreamReader(fs);
string text = sr.ReadToEnd();
Console.WriteLine(text);
查看写入控制台的内容后,我发现这是站点 HTML 代码。
有没有办法说服 SharePoint 给我文件的内容而不是漂亮的评论网站?
好吧,结果是我在发布问题后不久偶然发现了解决方案。
如this 所示,可以使用另一个网络服务 - copy.asmx - 从共享点下载文件,这足以满足我的需要。
以防 link 损坏,这里是代码:
string Path = @"awesome-valid-url";
//CopyService is the reference to the webservice
CopyService.Copy cs = new CopyService.Copy();
cs.Credentials = System.Net.CredentialCache.DefaultCredentials;
CopyService.FieldInformation myFieldInfo = new CopyService.FieldInformation();
CopyService.FieldInformation[] myFieldInfoArray = { myFieldInfo };
byte[] myByteArray;
// Call the web service
uint myGetUint = cs.GetItem(Path, out myFieldInfoArray, out myByteArray);
// Convert into Base64 String
string base64String;
base64String = Convert.ToBase64String(myByteArray, 0, myByteArray.Length);
// Convert to binary array
byte[] binaryData = Convert.FromBase64String(base64String);
// Create a temporary file to write the text of the form to
string tempFileName = @"where-to-put-it.xml";
// Write the file to temp folder
FileStream fs = new FileStream(tempFileName, FileMode.CreateNew, FileAccess.ReadWrite);
fs.Write(binaryData, 0, binaryData.Length);
fs.Close();
也许我什至可以解决实际保存文件的问题,反正我有我需要的所有字节。
我目前正在处理一个项目(WinForms、C#、VS2012),我需要从 SharePoint(我认为是 2010)文档库加载一个 InfoPath-XML 文件并进行一些嗅探对于其中的特殊元素。
我不是在 SharePoint 服务器上开发,因为与 SharePoint 的连接只是程序实际执行的一小部分。我只是插入一些 SharePoint 列表来假装我正在查询数据库。 (我知道,SharePoint 列表在适当的数据库意义上不是数据库表,但这不是重点)列表包含对我的程序至关重要的数据,并且通过 Web 服务获取列表内容非常简单。
我没有使用 SharePoint 对象模型 (SharePoint*.dll),因为我没有这些并且无法正确引用它们,Web 服务直到现在都运行良好。
查询列表后,我知道存储在文档库中的文件的文件名。当我 assemble 此文件的 url 并将其粘贴到我选择的浏览器中时,SharePoint 在其 GUI 中显示该文件,因为它显示在 InfoPath 中(当我粘贴完全相同的 url).
我在本地保存了一份 xml。我可以轻松地将其打开并处理为 xml。但是,当我尝试直接从服务器打开文件时,我的 Stream(或 FileStream)包含 HTML-SharePoint 站点的代码,向我显示我的 InfoPath 文档。这是我的打开代码:
string Path = @"awesome-correct-url";
WebRequest request = WebRequest.Create(Path);
request.UseDefaultCredentials = true; //SharePoint needs to know I am allowed to open the file
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream fs = response.GetResponseStream();
StreamReader sr = new StreamReader(fs);
string text = sr.ReadToEnd();
Console.WriteLine(text);
查看写入控制台的内容后,我发现这是站点 HTML 代码。
有没有办法说服 SharePoint 给我文件的内容而不是漂亮的评论网站?
好吧,结果是我在发布问题后不久偶然发现了解决方案。
如this 所示,可以使用另一个网络服务 - copy.asmx - 从共享点下载文件,这足以满足我的需要。 以防 link 损坏,这里是代码:
string Path = @"awesome-valid-url";
//CopyService is the reference to the webservice
CopyService.Copy cs = new CopyService.Copy();
cs.Credentials = System.Net.CredentialCache.DefaultCredentials;
CopyService.FieldInformation myFieldInfo = new CopyService.FieldInformation();
CopyService.FieldInformation[] myFieldInfoArray = { myFieldInfo };
byte[] myByteArray;
// Call the web service
uint myGetUint = cs.GetItem(Path, out myFieldInfoArray, out myByteArray);
// Convert into Base64 String
string base64String;
base64String = Convert.ToBase64String(myByteArray, 0, myByteArray.Length);
// Convert to binary array
byte[] binaryData = Convert.FromBase64String(base64String);
// Create a temporary file to write the text of the form to
string tempFileName = @"where-to-put-it.xml";
// Write the file to temp folder
FileStream fs = new FileStream(tempFileName, FileMode.CreateNew, FileAccess.ReadWrite);
fs.Write(binaryData, 0, binaryData.Length);
fs.Close();
也许我什至可以解决实际保存文件的问题,反正我有我需要的所有字节。