MSのXMLサンプルは以下のように記述がありました。
<Batch OnError="Continue" ListVersion="1" ViewName="270C0508-A54F-4387-8AD0-49686D685EB2"> <Method ID="1" Cmd="Update"> <Field Name="ID">4<Field> <Field Name=""></Field> </Method> <Method ID="2" Cmd="Update"> <Field Name="ID" >6</Field> <Field Name=""></Field> </Method> . . . </Batch>
<Batchタグ>
Batchタグのアトリビュートは省略可能のようです。ただ、更新したい項目がビューレベルで存在しなければならないようで、ViewNameは適宜入れておいたほうがいいかもしれません。省略するとデフォルトビューを参照して更新がかかる模様です。
<Methodタグ>
MethodタグのIDはライブラリアイテムのIDとは違っていて、処理IDみたいなものらしいです。要は、ID=1,ID=2といった感じで複数の更新処理をライブラリに加えて、エラーとなった処理があった場合、このIDと紐づいたXMLを返すために必要なんだと思います。ライブラリのID=1をアップデートしたいというバインドの意味ではないようです。Cmd=”Update”はそのままライブラリ更新を表します。”New”にすると新規アイテムを登録するようです。
<Fieldタグ>
■Update
MethodタグにCmd=”Update”と書いた場合、更新するアイテムに対して一意にバインドする必要があります。ので、FieldタグのNameアトリビュートにIDと設定してあげて、バインドしたいIDの値をvalueを与えてあげてください。これで一意にバインドできました。続けて更新したいフィールドをそのままFieldのNameアトリビュートに設定して(例えばTitleとか)valueを与えます。ここで気になるのは、FieldのNameアトリビュートに記述される内容が、アイテムのバインドフィールドなのか、更新したいフィールドなのか、何を持って判別するんだ?と言ったところだと思います。乱暴に言ってしまうとName=”ID”はバインドフィールドでしかないようです。つまり、Author=”ひげもじゃ”とかいうゆるいバインドは出来ないということです。多分。ですのでName=”ID”以外のアトリビュートは、更新フィールドだと言うことになります。多分。同時にName=”ID”というアトリビュートは必須になるのではないかと思います。多分。
■New
MethodタグにCmd=”New”と書いた場合、アイテムが新規登録されます。この場合IDはインクリメンタルに振られるようですので、IDをNameアトリビュートに指定したFieldタグごと、無くても通りました。
<Field Name="ID">New</Field>
とMSDNには記述がありますが、省略可能のようです。
さらに、MSDNのほうにはディレクトリの作成XMLが書いてあったので、試して見ました。どうやらディレクトリを作成しろという命令は
<Field Name="FSObjType">1</Field>
という記述にあるようです。さらにディレクトリ名をつけるには、
<Field Name="BaseName">ディレクトリ名</Field>
を指定する必要があるようです。Name=”Title”からはディレクトリを受け取ってもらえないようです。また、FSObjTypeのvalueが1の場合はディレクトリで、0の場合はアイテムをあらわすようです。
では、ディレクトリ内にアイテムを作りたい場合はどうすればいいのでしょう。これがホントわっかんなくて色々試しました。
結果から言うと、ライブラリの各アイテムには、FileRefというフィールドを持っているらしく、これを指定してあげることでディレクトリ内にアイテムの作成が成功しました。本筋かどうかはわかりません。
まず、普通にアイテムをつくったものをgetListItemsで参照してみると、
ows_FileRef='1;#<yourSitePath>/Lists/<yourListName>/1_.000'
こんな感じでFileRefに値が格納されています。これはID=1のアイテムを拾ったものです。この1_.000というところを一意に出来れば、ディレクトリ内にアイテムを作成することが出来るようです。アイテムの実体が存在するかどうかはわかりませんが、同じディレクトリ空間には重複した値は入れられないようです。当然と言えば当然なのですが。
<Field Name="FileRef">/<yourSitePath>/Lists/<yourListName>/<yourDirectory1>/<yourDirectory2>/1_.000</Field>
と言った感じで、ライブラリのディレクトリ空間をまたいでアイテムが作成できます。
それでは、
- アイテムを2つ新規作成して
- ID=2のほうのタイトルを更新して
- ディレクトリを作って
- そのなかにアイテムを登録する
XMLを組み立ててみると以下のようになります。
<Batch> <Method ID="1" Cmd="New"> <Field Name="Title">FirstPost</Field> </Method> <Method ID="2" Cmd="New"> <Field Name="Title">SecondPost</Field> </Method> <Method ID="3" Cmd="Update"> <Field Name="ID">2</Field> <Field Name="Title">SecondPost_updated</Field> </Method> <Method ID="4" Cmd="New"> <Field Name="BaseName">Directory</Field> <Field Name="FSObjType">1</Field> </Method> <Method ID="5" Cmd="New"> <Field Name="FileRef">/<yourSitePath>/Lists/<yourLibName>/Directory/item</Field> <Field Name="Title">ThirdPost</Field> </Method> </Batch>
最後のMethod ID=”5″でつくるアイテムのFileRef(itemの部分)はスタティックに持つと、もう一回処理を走らせるとエラーとなります。タイムスタンプなんかを設定するか、一番新しいIDを拾ってきて設定したほうがいいかもしれません。あるいは、もっと他のやり方があるかもしれません。それではサンプルソースを置いておきます。
function getHttpReq(){
return window.XMLHttpRequest ? new XMLHttpRequest() : ( function() {
try { return new ActiveXObject( "Msxml2.XMLHTTP" ); }
catch( e ) { return new ActiveXObject( "Microsoft.XMLHTTP" ); }
}());
}
function updateListItems()
{
var httpInst = getHttpReq();
var libName = '<yourLibName>';
httpInst.open( "POST", "<yourSitePath>/_vti_bin/Lists.asmx", false );
httpInst.setRequestHeader( 'Content-Type','text/xml; charset=utf-8' );
httpInst.setRequestHeader( 'SOAPAction','http://schemas.microsoft.com/sharepoint/soap/UpdateListItems' );
var sendXml = '<Batch><Method ID="1" Cmd="New"><Field Name="Title">FirstPost</Field></Method><Method ID="2" Cmd="New"><Field Name="Title">SecondPost</Field></Method><Method ID="3" Cmd="Update"><Field Name="ID">2</Field><Field Name="Title">SecondPost_updated</Field></Method><Method ID="4" Cmd="New"><Field Name="BaseName">Directory</Field><Field Name="FSObjType">1</Field></Method><Method ID="5" Cmd="New"><Field Name="FileRef">/<yourSitePath>/Lists/<yourLibName>/Directory/item</Field><Field Name="Title">ThirdPost</Field></Method></Batch>';
var postBody = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><UpdateListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/"><listName>' + libName + '</listName><updates>' + sendXml + '</updates></UpdateListItems></soap:Body></soap:Envelope>';
httpInst.onreadystatechange = function()
{
if ( httpInst.readyState == 4 ){
xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
xmlDoc.async = false;
alert( httpInst.responseText );
}
}
httpInst.send( postBody );
}










