/// <summary>
 /// Make the Consignments enumerable according to the CREATE section of the doc.
 /// Then index the Consignments for each of the relevant sections.
 /// Assumption: The CREATE section exists, or we have no Consignments.
 /// </summary>
 private bool Initialize(IndexBy indexBy)
 {
     IdPropertyXPath = XPathExpression.Compile("./" + indexBy.ToString() + "/text()");
     //determine available sections
     hasCreate       = doc.NodeExists("/document/CREATE");
     hasBook         = doc.NodeExists("/document/BOOK");
     hasShip         = doc.NodeExists("/document/SHIP");
     hasPrint        = doc.NodeExists("/document/PRINT");
     hasError        = doc.NodeExists("//ERROR");
     hasRuntimeError = doc.NodeExists("/runtime_error");
     //prepare iterator and indexes
     if (doc.NodeExists("/document"))
     {
         if (hasCreate)
         {
             createEnum  = doc.GetChildEnumerable(XPathExpression.Compile("/document"), "CREATE");
             createIndex = doc.GetChildIndex(XPathExpression.Compile("/document"), "CREATE", IdPropertyXPath);
         }
         if (hasBook)
         {
             bookIndex = doc.GetChildIndex(XPathExpression.Compile("/document/BOOK"), "CONSIGNMENT", IdPropertyXPath);
         }
         if (hasShip)
         {
             shipIndex = doc.GetChildIndex(XPathExpression.Compile("/document/SHIP"), "CONSIGNMENT", IdPropertyXPath);
         }
         //...etc
         return(true);
     }
     else
     {
         return(false); //after all, not worthy of further investigation.
     }
 }