Migrating Wiki Pages Remotely – Part 04

Note, this series starts at 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:
blogs.msdn.com/dwinter/archive/2008/06/28/migrating-wiki-pages-remotely-part-05.aspx