The*_*ght 5 xml sharepoint field sharepoint-2010 sharepoint-list
在SharePoint 2003和2007中,有一个名为AllLists的表,其中有一个名为tp_Fields的列,其中包含一个包含特定列表的所有字段的xml.
存储在tp_Fields列中的xml示例对于包含3个字段的SharePoint列表是这样的:
<FieldRef Name="ContentTypeId" />
<FieldRef Name="_ModerationComments" ColName="ntext1" />
<FieldRef Name="WebPartTypeName" ColName="nvarchar9" />
Run Code Online (Sandbox Code Playgroud)
我们有一个应用程序正在使用C#代码从该列读取,例如
var tpFields = (String) drView["tp_Fields"];
Run Code Online (Sandbox Code Playgroud)
在SharePoint 2010中,此列的数据类型已更改为varbinary,而是仅包含一些二进制数据!
(我知道理想/推荐的解决方案是使用SharePoint Web服务或SharePoint对象模型而不依赖于基础表,但不幸的是我们有一个现有的应用程序,我们也需要使它与2010一起工作.我希望我们不必重新设计一切!)
我如何知道SharePoint列表中SharePoint数据库中的哪些字段?或者如果可能的话,如何将此varbinary列转换为与之前相同的xml?
我希望这个问题很明确(对它的可能性没什么希望).
谢谢,
只是为了分享,我编写了下面的方法,它现在可以从中提取 xml,尽管不能保证生成的 xml 与 SharePoint 2003/2007 兼容。
private static string getXmlFromTpFields(byte[] tpFields)
{
using (var memoryStream = new MemoryStream(tpFields))
{
// ignore the first 14 bytes; I'm not sure why but it works!
for (var index = 0; index <= 13; index++)
memoryStream.ReadByte();
var deflateStream = new DeflateStream(memoryStream, CompressionMode.Decompress);
using (var destination = new MemoryStream())
{
deflateStream.CopyTo(destination);
var streamReader = new StreamReader(destination);
destination.Position = 0;
return streamReader.ReadToEnd();
}
}
}
Run Code Online (Sandbox Code Playgroud)