Migrating Wiki Pages Remotely – Part 04


Note, this series starts at http://blogs.msdn.com/dwinter/archive/2008/06/28/migrating-wiki-pages-remotely-part-01.aspx


We just looked at using copy.asmx to get WikiField.  Now let’s look at getting the field by using just lists.asmx.   You may notice that the segment of code I took this from is using the destination web service instead of the source. This one is interesting because if WikiField is empty, you can see how I parsed the ows_MetaInfo propertybag.


 


if (txt_SelectedWiki2.Text.Length > 0)


{


    Server2WS.Lists s2L = new WikiMigrator.Server2WS.Lists();


    s2L.Url = txt_SiteName2.Text.Trim().TrimEnd(“/”.ToCharArray()) + “/_vti_bin/lists.asmx”;


    s2L.Credentials = System.Net.CredentialCache.DefaultCredentials;


    try


    {


        // I know a lot of folks want to define their own view


        // instead of using the stock ones.  I threw this in as


        // an example.


        XmlDocument xmlDocLI = new System.Xml.XmlDocument();


        XmlNode ndQueryLI = xmlDocLI.CreateNode(XmlNodeType.Element,“Query”,“”);


        XmlNode ndViewFieldsLI = xmlDocLI.CreateNode(XmlNodeType.Element,“ViewFields”,“”);


        XmlNode ndQueryOptionsLI = xmlDocLI.CreateNode(XmlNodeType.Element,“QueryOptions”,“”);


        // I’m not actually using ndQueryOptionsLI, it is


        // here as an example


        ndQueryOptionsLI.InnerXml = “<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>” +


            “<DateInUtc>TRUE</DateInUtc>”;


        ndViewFieldsLI.InnerXml = “<FieldRef Name=’FileRef’ />” +


            “<FieldRef Name=’WikiField’ />” +


            “<FieldRef Name=’LinkFilename’ />”;


        // I’m not actually using ndQueryLI, it is here as an example


        ndQueryLI.InnerXml = “<Where><Eq><FieldRef Name=’FileRef’ />” +


            “<Value Type=’Text’>[server-relative URL of wiki page]</Value></Eq></Where>”;


        //


        // Need to provide a large number or we will restrict at the default 100 items if null


        XmlNode ndListItems = s2L.GetListItems(txt_SelectedWiki2.Text, null, null, ndViewFieldsLI, txtNumberRows.Text, null, null);


        XmlNode ndListItemDetail = ndListItems.ChildNodes[1];


        foreach (XmlNode item in ndListItemDetail.ChildNodes)


        {


            try


            {


                if (item.Attributes != null)


                {


                    string itemName = item.Attributes[“ows_LinkFilename”].Value;


                    Trace.WriteLine(“Fixing: “ + itemName);


                    if (!string.IsNullOrEmpty(itemName))


                    {


                        string wikiData = item.Attributes[“ows_WikiField”].Value;


                        string actualWikiData = string.Empty;


                        if (string.IsNullOrEmpty(wikiData))


                        {


                            Trace.WriteLine(“…using ows_MetaInfo instead of ows_WikiField”);


                            string itemData = item.Attributes[“ows_MetaInfo”].Value;


                            Regex metaProp = new Regex(@”( \w*:\w{2}\|)”);


                            string[] regexData = metaProp.Split(itemData);


/* I am going to use prepnextMatch to say that the next iteration in the loop has the WikiField data if it exists.  It was a rare condition where WikiField wouldn’t return it and this method would, and I believe it was caused by the Alpha upgrades that nobody else should have gone through on some of our internal servers.  None-the-less, it may be interesting to see this alternate method. */


                            bool prepnextMatch = false;


                            foreach (string data in regexData)


                            {


                                try


                                {


                                    if (data != string.Empty)


                                    {


                                        if (!prepnextMatch)


                                        {


                                            if (data == ” WikiField:SW|”)


                                            {


                                                prepnextMatch = true;


                                            }


                                        }


                                        else if (prepnextMatch && actualWikiData == string.Empty)


                                        {


                                            actualWikiData = data;


                                            break;


                                        }


                                        else


                                        {


                                            throw new System.Exception(“E_FAIL”);


                                        }


                                    }


                                }


                                catch {}


                            }


                        }


                        else


                        {


                            actualWikiData = wikiData;


                        }


Part 05:
http://blogs.msdn.com/dwinter/archive/2008/06/28/migrating-wiki-pages-remotely-part-05.aspx