リストにXMLファイルでListInstanceを指定することにより、リストにデータを取り込む方法があります。 しかし、このアプローチは記事で検討したよりも便利ではありません。 ListDefinitionsは、リストの作成に必ずしも実用的ではありません。さらに、ソリューションから展開するのではなく、サイトに既に存在するリストを作成する必要がある場合があります。
したがって、アイデアは次のロジックです。
Excelのデータを使用してテーブルを作成し、
ExcelからXMLにデータをエクスポートし、
Visual StudioプロジェクトへのXMLファイルの追加
ファイルのXMLコンテンツを解析し、アクティベーション用のレシーバー機能のリストにデータを追加します。
Excelの使用は非常に便利です。 まず、そこにあるデータは簡単に入力できます。 マウスで単純に引き伸ばすことで、異なる行のコピーを作成できます。 さまざまな式を記述して、テストなどのランダム値を与えることができます。 そして最も重要なのは、顧客が通常参照情報を送信するのはこの形式であるということです。つまり、Excelでの要求に応じて情報を準備する方がはるかに簡単になります。
アクションのシーケンス:
1.別のシートのExcelブックにデータテーブルを作成します。
2.次の形式でデータスキーマを表す.xsdファイルを作成します。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Currencies">
<xs:complexType>
<xs:sequence>
<xs:element ref="Currency" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Currency">
<xs:complexType>
<xs:sequence>
<xs:element name="Title" type="xs:string"/>
<xs:element name="Currency_IsNational" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
便宜上、サイト上のリストが呼び出される(またはそのアドレスの主要部分として)ルート要素に名前を付けます。 この要素を通貨と呼びました。 XMLを解析するとき、すぐにこの名前を使用して目的のリストにアクセスできます。
目的のリストのフィールドのInternalNameに従ってフィールド名を指定します(上記の例では、これはTitleとCurrency_IsNationalです)。
また、値の型に「xs:string」の価値があることを恥ずかしがらないでください。 XMLを解析するときに、SPListItemオブジェクトに書き込まれると、それ自体が目的の型に変換される文字列値を受け取ります。
Userなどのより複雑なタイプを使用する必要がある場合は、たとえば、Excelテーブルでログイン名を指定し、コードでSPFieldUserValueへの追加の変換を実行します。 これについては後で説明します。
3. Excelの「開発者」タブをアクティブにします。
4.このタブで、[ソース]ボタンをクリックします。
5.表示されるパネルで、[XMLマップ]ボタンをクリックします。
6. [追加]ボタンをクリックして、以前に作成した.xsdファイルを追加します。
7.スキーマを追加した後、Excelでテーブル見出しを選択し、右側のパネルで「要素の関連付け」データツリーをクリックします。
したがって、テーブルをデータスキーマにマップします。 これで、XMLにエクスポートできます。
8. [エクスポート]をクリックして、.xmlファイルを保存します。
エクスポートされたファイルは次のようになります。
9.サイトにアップロードするすべてのテーブルに対して上記の操作を実行します。
10. Visual Studioプロジェクトでモジュールを作成し、この方法で作成されたデータを含むすべての.xmlファイルを追加します。 たとえば、InitialDataという名前を付けます。
機能にモジュールを含めることを忘れないでください。
11.機能がアクティブになると、InitialDataという名前のフォルダーがサイトに作成され、そこに.xmlファイルが追加されます。
12.次に、機能アクティベーションレシーバーで、これらのxmlファイルを解析し、目的のリストにアイテムを作成するためのロジックを追加します。
これらのアクションが完了するまでに、リストはすべての必要なフィールドを備えたサイトにすでに存在しているはずです。 同時に、すでに他のデータが含まれているデータをリストに入力できます。
以下のメソッドは、InitialDataフォルダー内のすべてのxmlファイルを調べ、それぞれに対してImportToSPListメソッドを呼び出します。
public void Import()
{
// _siteUrl -
using (SPSite site = new SPSite(_siteUrl))
{
SPWeb web = site.RootWeb;
// _initialDataFolderName - (, )
SPFolder initialDataFolder = web.RootFolder.SubFolders[_initialDataFolderName];
foreach (SPFile file in initialDataFolder.Files)
{
if (file.Name.EndsWith(".xml", StringComparison.CurrentCultureIgnoreCase))
{
using (MemoryStream inStream = new MemoryStream(file.OpenBinary()))
{
using (XmlTextReader reader = new XmlTextReader(inStream))
{
XmlDocument xd = new XmlDocument();
xd.Load(reader);
ImportToSPList(web, xd);
}
}
}
}
}
}
ImportToSPList xml, . , , , SPListItem, SPListItem'.
private void ImportToSPList(SPWeb web, XmlDocument xd)
{
XmlElement root = xd.DocumentElement;
// .
string rootName = root.LocalName;
string listUrl = String.Format("Lists/{0}/AllItems.aspx", rootName);
SPList list = web.GetListFromUrl(listUrl);
foreach (XmlNode item in root.ChildNodes)
{
SPListItem spListItem = list.AddItem();
//
foreach (XmlNode field in item.ChildNodes)
{
//
DataImportSpecialRule specialRule =
_diSpecialRules.FirstOrDefault(x => x.ListUrl == listUrl && x.FieldName == field.LocalName);
if (specialRule == null)
{
// ,
spListItem[field.LocalName] = field.InnerText;
}
else
{
// -
spListItem[field.LocalName] = specialRule.Converter(web, field.InnerText);
}
}
//
spListItem.Update();
}
}
また、必要に応じて文字列値をxmlからより複雑な型に変換するために必要なヘルパークラスDataImportSpecialRuleにも注意してください。
リストのアドレス、フィールドの名前、および変換のための関数を格納するDataImportSpecialRuleクラス自体は次のとおりです。
public delegate object GetTypedValue(SPWeb web, string value);
class DataImportSpecialRule
{
public string ListUrl { get; set; }
public string FieldName { get; set; }
public GetTypedValue Converter { get; set; }
}
この関数には、GetTypedValueデリゲートで説明されているシグネチャがあります。 入力では、SPWebと文字列値を受け取り、SPListItemフィールドに書き込む必要があるオブジェクトを返します。
最初に、例に示すように、すべてのディレクトリに適用されるすべてのルールを説明できます。
_diSpecialRules = new List()
{
new DataImportSpecialRule()
{
ListUrl = "Lists/BusinessBlocks/AllItems.aspx",
FieldName = "BusinessBlock_Group",
Converter = (SPWeb web, string value) =>
{
SPGroup group = web.SiteGroups[value];
return new SPFieldUserValue(web, group.ID, group.Name);
}
}
//
};
, , xml , , SPListItem .
. . , - .
private SPFieldMultiChoiceValue MultiChoiceConverter(SPWeb web, string value)
{
SPFieldMultiChoiceValue fValue = new SPFieldMultiChoiceValue();
foreach (string choice in value.Split(';')) fValue.Add(choice.Trim());
return fValue;
}
, . , .
:
, -, . , , xml , , .
.
SharePoint Channel
_diSpecialRules = new List()
{
new DataImportSpecialRule()
{
ListUrl = "Lists/BusinessBlocks/AllItems.aspx",
FieldName = "BusinessBlock_Group",
Converter = (SPWeb web, string value) =>
{
SPGroup group = web.SiteGroups[value];
return new SPFieldUserValue(web, group.ID, group.Name);
}
}
//
};
, , xml , , SPListItem .
. . , - .
private SPFieldMultiChoiceValue MultiChoiceConverter(SPWeb web, string value)
{
SPFieldMultiChoiceValue fValue = new SPFieldMultiChoiceValue();
foreach (string choice in value.Split(';')) fValue.Add(choice.Trim());
return fValue;
}
, . , .
:
, -, . , , xml , , .
.
SharePoint Channel